Я вижу много методов, которые указывают интерфейс как возвращаемое значение. Моя мысль, верная, что это означает: мой метод может возвратить каждый тип класса, который наследовался тому интерфейсу? если не дайте мне хороший ответ.
Да, ваш метод может вернуть любой тип, который реализует этот интерфейс.
Вот пример:
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
}
}
Да, этот метод может возвращать объект любого типа , который реализует этот интерфейс.
Но , чтобы использовать неинтерфейсные члены определенного типа, вам необходимо привести его к этому типу.
Да, это означает, что единственное, что вы знаете о возвращаемом объекте, это то, что он реализует интерфейс.
На самом деле, реальный тип объекта может быть даже недоступен вызывающему коду. Это может быть частный тип в отдельной сборке.
И на самом деле, метод может возвращать другой тип от одного вызова к другому (как в случае с абстрактной фабрикой).
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
Надеюсь, это поможет.