关于vb.net实例化接口的信息

为什么不能VB.Net找到一个接口扩展方法由于汉语语言表述的所带来的不易理解性,我们还是直接用代码来解释吧,如下的代码片段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static class StringExtentsion
{
public static string ToString(this string str)
{
return "Extentsion" + str;
}
}
class Program
{
static void Main(string[] args)
{
string str = "test";
Console.WriteLine(str.ToString()); // 输出结果为: test , 也就说编译器会优先选用原有类的实例化方法,如果没找到匹配方法再寻找扩展方法
Console.Read();
}
}
由上述的代码片段可以知:StringExtentsion类中扩展方法ToString 和 String类的原有的ToString方法 对于客户端代码而言,它们的语法表象是
一样的,但本质上一个是StringExtentsion类的静态方法 , 一个是String类的实例化方法 。然而编译运行没有产生错误,更没有产生警告 。所以在
这种情况下很容“埋雷” , 一不小心就会中招 。有人也许会说:我注意一下不要和.NET类库的方法重名就可以了 。但是你能保证 .NET 6、甚至.NET 10
的方法名和你写的绝对不重名吗?所以,扩展方法存在着版本控制的问题 。
接口的VB.NET( 一款行业软件)接口在VB.NET的类里,实现一个接口的语句是:
implements接口名称
例如,下面定义一个车(总称)的接口 , 这里的车是各种车的总称:
Public Interface ICar
Property color() As String
Property speed() As Long
Sub PrintInfo()
End Interface
然后在不同类型的“车”类里实现它:
Public Class A_Car
Implements ICar
Dim m_color As String, m_speed As Long
Public Property color() As String Implements ICar.color
Get
Return m_color
End Get
Set(ByVal Value As String)
m_color = Value
End Set
End Property
Protected Overrides Sub Finalize()
MsgBox(I was deconstructed!)
End Sub
Public Sub New()
m_color = Red
m_speed = 210
MsgBox(I was constructed!)
End Sub
Public Property speed() As Long Implements ICar.speed
Get
Return m_speed
End Get
Set(ByVal Value As Long)
m_speed = speed
End Set
End Property
Public Sub PrintInfo() Implements ICar.PrintInfo
MsgBox(Color:m_colorvbNewLineSpeed:m_speed, MsgBoxStyle.Information)
End Sub
End Class
在 Form 的 Load 事件中编写:
Dim myCar As New A_Car
myCar.PrintInfo()
运行之后就创建了一个 A_Car 类的实例 myCar,然后出现两个对话框 , 分别说明实例已经创建和汽车的信息 。当窗体卸载时,这个类的实例 myCar 将自动销毁 , 这时将出现一个“I was deconstructed!”的对话框 。
声明一个接口时,需要考虑以下几点:
1.接口主体只限于对方法,索引器以及属性的声明;
2.接口成员是隐式公开的,如果对其显式指定访问级别,就会出现编译器错误;
3.接口中不能包含字段,构造函数和常量等;
4.在接口中不能实现任何方法,属性或者索引器;
5.在指定方法时,只需要给出返回类型,名称和参数列表,然后分号结束 。
面向对象的接口
在C++中,一个类被允许继承多个类 。但是在Java以后的语言不被允许 。
这样,如果想继承多个类时便非常困难 。所以开发方想出了新办法:接口 。
一个接口内,允许包含变量、常量等一个类所包含的基本内容 。但是 , 接口中的函数不允许设定代码,也就意味着不能把程序入口放到接口里 。由上可以理解到 , 接口是专门被继承的 。接口存在的意义也是被继承 。和C++里的抽象类里的纯虚函数是相同的 。不能被实例化 。

推荐阅读