2012-01-24 3 views
5

Я просматривал какой-то унаследованный код, который у нас есть, и я заметил то, что показалось мне особенно странным.VB.NET Интерфейс Instantiation Oddity

Скажем, у нас есть конкретный класс TestClass. TestClass реализует интерфейс ITestClass.

Какое поведение следует ожидать в следующем случае? (Я не понимал, что это даже возможно)

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

Насколько я понимаю, вы будете вынуждены использовать TestClass вместо своего интерфейса собрата.

+0

Вы _certain_ 'ITestClass' является интерфейсом? Можете ли вы опубликовать код для этого? – Oded

+0

Когда я нависаю над «ITestClass» в Visual Studio, подсказка говорит, что это интерфейс. Когда я наводил курсор на 'TestClass', он говорит, что это класс. –

ответ

8

специальный случай, где интерфейс может быть создан как класс, и он связан с CoClassAttribute. Смотрите этот блог для деталей:

Пример из блога переведенной на 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

Ничего себе. Какое извращение языковых особенностей :) – Oded

+0

Вау ... Я размышлял о DLL, и это именно то, что происходит. Это странно. –

+0

Я давно думал, что должна быть концепция «со-класса» в паре с интерфейсом; с точки зрения * потребителя, единственная разница между интерфейсами и классами заключается в том, что интерфейсы не могут иметь статические методы или конструкторы; на мой взгляд, было бы чище не требовать от них каких-либо различий. Могут ли совместные классы использовать статические методы? Будет ли какая-либо разумная модель такого совместного класса, позволяющая использовать методы расширения на интерфейсе, не требуя дополнительного импорта? – supercat