2012-01-24 8 views
5

Estaba revisando algún código heredado que tenemos y noté algo que me pareció particularmente extraño.VB.NET Interfaz Instantiation Oddity

Digamos que tenemos la clase concreta TestClass. TestClass implementa la interfaz ITestClass.

¿Qué tipo de comportamiento debo esperar en el siguiente caso, entonces? (No me di cuenta que esto era incluso posible)

Dim testClass as TestClass = Nothing 
Try 
    testClass = New ITestClass 
    ... 
End Try 

Por lo que yo entiendo, que se vería obligado a utilizar TestClass en lugar de su contraparte interfaz.

+0

¿Estás _certain_ 'ITestClass' es una interfaz? ¿Puedes publicar el código para ello? – Oded

+0

Cuando cierro sobre 'ITestClass' en Visual Studio, la información sobre herramientas dice que es una interfaz. Cuando cierro sobre 'TestClass' dice que es una clase. –

Respuesta

8

Hay un caso especial, donde una interfaz se puede instanciar como una clase, y está relacionada con el CoClassAttribute. Ver esta entrada del blog para más detalles:

Ejemplo de la entrada del blog traducido al VB:

<ComImport(), Guid("C906C002-B214-40d7-8941-F223868B39A5"), CoClass(GetType(Foo))> _ 
Public Interface IFoo 
End Interface 

Public Class Foo 
    Implements IFoo 
End Class 

Sub Main() 
    Dim f As New IFoo() ' Compiles 
End Sub 
+4

Wow. Qué perversión de las características del lenguaje :) – Oded

+0

Wow ... Reflexioné en la DLL y eso es exactamente lo que está pasando. Eso es raro. –

+0

Hace tiempo que pensaba que debería haber un concepto de "co-clase" emparejado con una interfaz; desde el punto de vista de * consumer *, la única diferencia entre interfaces y clases es el hecho de que las interfaces no pueden tener métodos o constructores estáticos; en mi opinión, sería más limpio no exigir que haya alguna diferencia. ¿Las co-clases pueden hacer que los métodos estáticos estén disponibles? ¿Habría algún patrón razonable para que tales métodos de extensión de creación de clases compartidas estén disponibles en la interfaz sin requerir importaciones adicionales? – supercat