Если метод возвращает интерфейс, что это значит? - PullRequest
6 голосов
/ 04 марта 2010

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

Ответы [ 4 ]

11 голосов
/ 04 марта 2010

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

Вот пример:

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
    }
}
5 голосов
/ 04 марта 2010

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

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

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

4 голосов
/ 04 марта 2010

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

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

3 голосов
/ 04 марта 2010

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

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

...