2012-01-24 135 views
5

我正在瀏覽一些我們已有的遺留代碼,並且發現了一些讓我感到奇怪的東西。VB.NET接口實例化Oddity

假設我們有具體的類TestClassTestClass實現了界面ITestClass

那麼在下列情況下我應該期待什麼樣的行爲呢? (我不知道這是甚至可能)

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

據我瞭解,你將被迫利用TestClass,而不是它的接口對應。

+0

你_certain_'ITestClass'是一個接口?你可以發佈代碼嗎? – Oded

+0

當我將鼠標懸停在Visual Studio中的ITestClass上時,工具提示表示它是一個接口。當我將鼠標懸停在TestClass上時,它說它是一個類。 –

回答

8

There's one特殊情況下,其中一個接口可以類似實例化,它與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