2010-03-04 18 views
6

Veo muchos métodos que especifican una interfaz como valor de retorno. ¿Es cierto mi pensamiento de que significa que mi método puede devolver todos los tipos de clases que hereden de esa interfaz? si no, por favor dame una buena respuesta.Si un método devuelve una interfaz, ¿qué significa?

+7

@ddimitrov las preguntas más básicas están permitidas en SO, bien podría haber otra respuesta plausible, que es quizás la razón por la que preguntó. tu comentario no agrega nada –

+0

@ sam-holder, soy corregido. Eliminado mi comentario original. – ddimitrov

Respuesta

11

Sí, su método podría devolver cualquier tipo que implemente esa interfaz.

Aquí es un ejemplo:

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

Agregaría que casi siempre es una mala idea tratar de olfatear el tipo real y abatir. –

+2

@Steven - Por lo general, es una mala idea, sí, pero hay casos en que la transmisión descendente puede ser muy beneficiosa. –

+2

Buen ejemplo :) –

4

Sí, ese método puede devolver un objeto de cualquier tipo que implementa la interfaz.

Pero, para usar los miembros que no son de interfaz de un tipo particular, tendrá que convertirlo a ese tipo.

+0

Sí, traté de solucionarlo de inmediato, pero alguien más estaba editando mi publicación también. Me equivoqué. Pero obtuve mi insignia de limpieza. :) –

+0

El método puede devolver un tipo de clase o un tipo de valor encuadrado. No puede devolver un tipo de valor real. La distinción a veces puede ser importante, ya que los tipos de valores encuadrados se comportan como tipos de clase.En algunos casos, una rutina que acepta un 'U donde U: IEnumerable ' puede comportarse de manera muy diferente cuando pasa un 'IEnumerable ' contra cuando se pasa una estructura como 'List .Enumerator'. – supercat

5

Sí, significa que lo único que sabe sobre el objeto que se devuelve es que implementa la interfaz.

De hecho, el tipo real del objeto puede que ni siquiera esté accesible para el código de llamada. Podría ser un tipo privado en un ensamblaje por separado.

Y, de hecho, el método puede devolver un tipo diferente de una invocación a la siguiente (como en el caso de una fábrica abstracta).

+0

¡Una respuesta que compite, pero me siento obligado a votar! Sus bits de información extra serían muy útiles para alguien que intenta entender esto. –

+0

@Patrick Karcher - ¡Gracias! :-) –

3

C++ admite una técnica de programación llamada polimorfismo. Esa es una clase derivada que puede parecer una clase base a otro código que no sabe nada sobre las clases derivadas. Echar un vistazo a su ejemplo:

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; 
}; 

Ahora se puede ver en el código que hemos creado una forma de clase base (nuestra interfaz) y dos clases derivadas que se especializan esta clase, un rectángulo, un círculo otra. Ahora vamos a crear una función que imprime el área de una figura:

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

Esta función no le importa si es un círculo de rectángulo. O lo que importa es que ha pasado una forma y que puede obtener el área, independientemente del tipo.

lo que este código utiliza esta función:

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 

Espero que esto ayude.

+1

Vaya, disculpe, escribí esto en C++, no leí la pregunta lo suficiente como para ver que quería decir C#. Pero el mismo proceso aplica. Avíseme si desea que reescriba el código de muestra anterior en C#. – Cthutu

+0

gracias Cthutu. No esta muestra es muy clara. –

Cuestiones relacionadas