VB.NET接口实例化的奇怪行为

5
我正在查看我们的一些遗留代码,发现了一些特别奇怪的东西。
假设我们有一个具体类TestClass。TestClass实现了接口ITestClass。
那么在以下情况下,我应该期望什么样的行为呢?(我甚至没有意识到这是可能的)
Dim testClass as TestClass = Nothing
Try
   testClass = New ITestClass
   ...
End Try

据我所理解,你将被强制使用 TestClass 而不是它的接口对应项。

你确定 ITestClass 是一个接口吗?你能把它的代码贴出来吗? - Oded
当我在Visual Studio中悬停在“ITestClass”上时,工具提示显示它是一个接口。当我悬停在“TestClass”上时,它显示它是一个类。 - Joe Morgan
1个回答

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
哇...我反射到了DLL,确实就是这样。这太奇怪了。 - Joe Morgan
我一直认为应该有一个“协同类”概念与接口配对;从消费者的角度来看,接口和类之间唯一的区别在于接口不能有静态方法或构造函数;在我看来,不需要有任何区别会更加清晰。协同类能否使静态方法可用?是否有任何合理的模式可以使这样的协同类在不需要额外导入的情况下使扩展方法在接口上可用? - supercat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接