Если метод возвращает интерфейс, что это означает?

Я вижу много методов, которые указывают интерфейс как возвращаемое значение. Моя мысль, верная, что это означает: мой метод может возвратить каждый тип класса, который наследовался тому интерфейсу? если не дайте мне хороший ответ.

6
задан Henk Holterman 4 March 2010 в 18:12
поделиться

4 ответа

Да, ваш метод может вернуть любой тип, который реализует этот интерфейс.

Вот пример:

using System;

class Foo
{
    public IComparable GetComparable()
    {
        // Either of these return statements
        // would be valid since both System.Int32
        return 4;
        // and System.String
        return "4";
        // implement System.IComparable
    }
}
11
ответ дан 8 December 2019 в 05:21
поделиться

Да, этот метод может возвращать объект любого типа , который реализует этот интерфейс.

Но , чтобы использовать неинтерфейсные члены определенного типа, вам необходимо привести его к этому типу.

4
ответ дан 8 December 2019 в 05:21
поделиться

Да, это означает, что единственное, что вы знаете о возвращаемом объекте, это то, что он реализует интерфейс.

На самом деле, реальный тип объекта может быть даже недоступен вызывающему коду. Это может быть частный тип в отдельной сборке.

И на самом деле, метод может возвращать другой тип от одного вызова к другому (как в случае с абстрактной фабрикой).

5
ответ дан 8 December 2019 в 05:21
поделиться

C ++ поддерживает метод программирования, называемый полиморфизмом. То есть производный класс может выглядеть как базовый класс для другого кода, который ничего не знает о производных классах. Взгляните на его пример:

class Shape
{
public:
    virtual float Area () const = 0;
};

class Rectangle: public Shape
{
public:
    Rectangle (float width, float height)
        : m_width(width)
        , m_height(height)
    {}

    virtual float Area () const
    {
        return m_width * m_height;
    }

private:
    float m_width;
    float m_height;
};

class Circle: public Shape
{
public:
    Circle (float radius)
        : m_radius(radius)
    {}

    virtual float Area () const
    {
        return 3.141592653f*(m_radius*m_radius);
    }

private:
    float m_radius;
};

Теперь вы можете видеть из этого кода, что мы создали базовый класс Shape (наш интерфейс) и два производных класса, которые специализируются на этом классе, один прямоугольник, другой круг. Теперь давайте создадим функцию, которая распечатывает область фигуры:

void PrintArea (const Shape& shape)
{
    printf("Area of shape = %f",shape.Area());
}

Этой функции все равно, если это круг или прямоугольник.Или он заботится о том, чтобы он передал форму и чтобы вы могли получить ее площадь, независимо от типа.

Итак, этот код использует эту функцию:

 Rectangle r (5.0f,4.0f);
 Circle c (25.0f);

 PrintArea(r);      // Print the area of the rectangle
 PrintArea(c);      // Print the area of the circle

Надеюсь, это поможет.

3
ответ дан 8 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: