2010-03-04 2 views
6

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

+7

@ ddimitrov самые простые вопросы разрешены на SO, возможно, был еще один правдоподобный ответ, возможно, поэтому он спросил. ваш комментарий ничего не добавляет. –

+0

@ sam-holder, я стою исправлено. Удалил мой оригинальный комментарий. – ddimitrov

ответ

11

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

Вот пример:

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 
    } 
} 
+2

Я бы добавил, что почти всегда плохая идея пытаться вынюхать реальный тип и понизить. –

+2

@Steven - Это, как правило, плохая идея, да, но бывают случаи, когда понижение может быть очень полезным. –

+2

Хороший пример :) –

4

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

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

+0

Да, я попытался исправить это сразу, но кто-то еще редактировал мой пост. Все испортилось. Но я получил свой очищающий значок. :) –

+0

Метод может возвращать тип класса или тип поля в штучной упаковке. Он не может вернуть тип реального значения. Различие может иногда иметь важное значение, поскольку типы с короткими значениями ведут себя как типы классов.В некоторых случаях подпрограмма, которая принимает 'U, где U: IEnumerable ' может вести себя по-разному, когда передается «IEnumerable », в отличие от того, когда она передана структурой типа «Список .Enumerator». – supercat

5

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

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

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

+0

Конкурирующий ответ, но я чувствую себя вынужденным повышать! Ваши лишние информационные биты будут очень полезны для тех, кто пытается понять это. –

+0

@Patrick Karcher - Спасибо! :-) –

3

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 

Надеется, что это помогает.

+1

К сожалению, я извиняюсь, что написал это на C++, не прочитал вопрос достаточно хорошо, чтобы увидеть, что вы имеете в виду C#. Но тот же процесс применяется. Дайте мне знать, если вы хотите, чтобы я переписал пример кода выше на C#. – Cthutu

+0

спасибо Cthutu. Нет, этот образец очень ясен. –

Смежные вопросы