2012-01-24 8 views
5

Stavo guardando attraverso il codice precedente che abbiamo e ho notato qualcosa che mi sembrava particolarmente strano.Interfaccia VB.NET Odio Odio

Supponiamo di avere la classe di calcestruzzo TestClass. TestClass implementa l'interfaccia ITestClass.

Che tipo di comportamento dovrei aspettarmi nel caso seguente, quindi? (Non mi rendo conto che questo era anche possibile)

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

Per quanto ho capito, si sarebbe costretti a utilizzare TestClass al posto del suo omologo interfaccia.

+0

Sei _certain_ 'ITestClass' è un'interfaccia? Puoi pubblicare il codice per questo? – Oded

+0

Quando passo il mouse su 'ITestClass' in Visual Studio, il tooltip dice che è un'interfaccia. Quando passo il mouse su 'TestClass', si dice che è una classe. –

risposta

8

C'è un caso speciale, in cui un'interfaccia può essere istanziata come una classe ed è correlata allo CoClassAttribute. Vedere questo post del blog per i dettagli:

Esempio dal post sul blog tradotto in 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. Che perversione delle caratteristiche del linguaggio :) – Oded

+0

Wow ... Ho riflettuto nella DLL e questo è esattamente quello che sta succedendo. Questo è strano. –

+0

Ho pensato a lungo che ci dovrebbe essere un concetto di "co-classe" abbinato a un'interfaccia; da un punto di vista * consumer *, l'unica differenza tra interfacce e classi è il fatto che le interfacce non possono avere metodi o costruttori statici; a mio avviso, sarebbe più pulito non richiedere che ci fosse alcuna differenza. Le co-classi possono rendere disponibili metodi statici? Ci sarebbe uno schema ragionevole per una simile co-classe che rende i metodi di estensione disponibili sull'interfaccia senza richiedere importazioni extra? – supercat