好奇的问题 - 接口变量(即dim x为Iinterface = object?)以及对象是否为表单

时间:2010-03-10 16:22:03

标签: vb.net winforms interface

vb.net windows表单问题。 我有3个具有完全相同功能的表单,所以我决定创建一个接口。

public Interface IExample

    public sub Add()

    Public sub Edit()

    Public sub View()

End Interface

然后我创建了3个表单,并为每个表单添加了“implements interface IExample”。

   public class frmExample1

        implements Interface IExample

frmExample2frmExample3

相同

最后,在代码中,我声明了一个接口类型的变量。 Dim objfrmExample as IExample

然后......

objFrmExample = frmExample2

此时,objfrmExample现在已经实例化,即使我没有做过“objfrmExpample = new [what-goes-here?]”,我很好奇为什么。

我可能猜到因为你无法实例化一个接口变量,所以vb.net会自动创建一个实例。但那只是猜测。问题是,通过声明Interface类型的变量是什么意思,它是如何工作的?

无论如何,只是好奇: - )

2 个答案:

答案 0 :(得分:3)

  

此时,objfrmExample现在已经实例化,即使我没有做过“objfrmExpample = new [what-goes-here?]”,我很好奇为什么。

这与接口无关。您始终可以在VB中处理表单类名称,就像它是一个实例一样。原因是VB编译器在My.Forms内创建了所有表单的属性。现在,您可以通过访问My.Forms.<FormName>来访问每个表单的“默认”实例。

现在出现了丑陋的部分:你也可以省略My.Forms.。换句话说,只要你只编写FormName并且从上下文中明确表示你需要一个实例而不是类名,VB就会像你写的一样{{1} }。

幸运的是, only 适用于表单,而不适用于任何其他类。 VB首次访问时会创建每个默认实例。因此,只要您不访问默认实例,就不会创建它。一旦你第一次访问它,VB就会创建它并调用它的构造函数。

答案 1 :(得分:2)

声明接口类型的变量时,可以使用任何实现接口的对象。因此,当设置接口类型的变量等于实现接口的类时,将完成隐式转换。例如。

Dim oExample as IExample
dim testForm as MyTestForm
oExample = MyTestForm

现在,这就是你这样做的方式,你可以这样做一个明确的演员

Dim oExample as IExample
Dim testForm as MyTestForm
oExample = CType(MyTestForm, IExample)

对于VB.NET和未实例化表单的具体示例,这是由于VB“功能”自动创建表单实例。