2009-04-24 21 views

Respuesta

12

No, no es como Objective-C y algunos otros idiomas. Debería declarar explícitamente la implementación de la interfaz.

+0

¿Lanzará una excepción si lo lanzo como interfaz? –

+4

Sí, si su clase no implementa explícitamente la interfaz, obtendrá una excepción si intenta realizarla como tal. –

+1

Solo puede lanzar un objeto a un objeto que aparezca en algún lugar de su cadena de herencia (esto incluye las interfaces implementadas en la cadena de herencia). – Powerlord

4

Siempre que IDoo tenga miembros, este código no se compilará. Si IDoo no tiene miembros, entonces sí, el elenco es seguro (pero obviamente de uso limitado).

+0

es un buen punto sobre el "límite obvio" d use "+1 –

+0

El OP especifica claramente * si una clase tiene todos los métodos/firmas correctos para una interfaz *, pero si no lo hace, entonces su punto es notable. –

2
public class A 
{ 
    public void DoSomething(); 
} 

public interface IDoSomething 
{ 
    void DoSomething(); 
} 

public class B : A, IDoSomething 
{ } 

B satisface IDoSomething.DoSomething heredando de un

3

Esto requeriría, en esencia Typing pato para trabajar en C#, lo que no sucede automáticamente.

Hay algunos libraries que pueden hacer esto, sin embargo.

17

Duck Typing

Lo que está haciendo alusión a que se conoce como "duck-typing" (el nombre de la expresión "si se ve como un pato y grazna como un pato, entonces debe ser un pato")

Con pato-tipado, la implementación de una interfaz está implícita una vez que haya implementado los miembros relevantes (tal como lo describe), sin embargo, .NET actualmente no tiene ningún soporte amplio para esto.

Con las características de lenguaje dinámicas emergentes planificadas para el futuro, no me sorprendería si esto fuera compatible de forma nativa por el tiempo de ejecución en el futuro cercano.

Por el momento, se puede sintetizar de pato a escribir a través de la reflexión, con a library such as this, lo que permitirá hacer un elenco de pato escrito así: IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)

algunas curiosidades

Curiosamente, hay un lugar pequeño donde se usa pato-tipado en C# hoy: el operador foreach. Krzysztof Cwalina states que a fin de ser enumerables por el operador foreach, una clase debe:

Proporcionar un método público GetEnumerator que no toma parámetros y devuelve un tipo que tiene dos miembros: a) un método MoveMext que no toma parámetros y devuelve un booleano, yb) una propiedad actual con un getter que devuelve un objeto .

en cuenta que no hace mención de IEnumerable ni IEnumerator. Aunque es común implementar estas interfaces al crear una clase enumerable, si soltara las interfaces pero dejara la implementación, su clase aún sería enumerable por foreach. Voila! ¡Pato escribiendo! (Example code here.)

+0

+1 para trivia! Niza uno –

+0

Gracias. No tuve tiempo de revisar lo que escribía el pato y siempre lo olvidé. Usted sirvió información en un plato plateado. –