VB.NET有很多值得学习的地方,这里我们主要介绍VB.NET Implements语句,包括介绍Test函数等方面。VB.NET采用的实现接口的语法是VB5发明的Implements,这个实现接口的语法在当今主流语言中***。比如我有两个接口:
- Interface Interface1
- Sub Test()
- End Interface
- Interface Interface2
- Sub Test()
- End Interface
这两个接口有一个完全一样的成员Test。假设我需要用一个类同时实现两个接口会怎么样呢?先想想看,如果是Java,JScrip.NET这样的语言就只能用一个Test函数实现两个接口的Test成员。假如两个Test只是偶然重名,其内容必须要分别实现怎么办,于是一些解决接口重名的设计出现了……。VB.NET Implements语句可以让你想怎么实现接口就怎么实现,比如下面的类Implementation用两个名字根本不一样的方法实现了两个接口。
- Public Class Implementation
- Implements Interface1, Interface2
- Public Sub Hello() Implements Interface1.Test
- End Sub
- Private Sub Hi() Implements Interface2.Test
- End Sub
- End Class
也就是说,VB允许用任意名字的函数实现接口中的成员,而且访问器可以是任意的,比如想用Public还是Private都可以。C#在处理重名成员上提供了显式实现(explicit implementation)的语法,其实现上述两个接口的语法为
- public class Class1 : Interface1, Interface2
- {
- public Class1{}
- void Interface1.Test{}
- void Interface2.Test{}
- }
注意这里,C#只能用接口名.成员名的名字来命名实现方法,而且访问器只能是private,不能公开显式实现的方法。
在考察了IL以后,我发现.NET支持隐式实现和显式实现两种方式。其中隐式实现只要在类里面放一个与接口成员方法名字一样的方法即可——这一种VB不支持。而显式实现则在方法的描述信息里加入:
.override TestApp.Interface1::Test
无论是C#的显式实现还是VB.NET Implements语句都是这样的原理。也就是说.NET提供了换名实现接口成员的功能,但是只有VB将这个自由让给了用户,而其他语言还是采用了经典的语法。
【编辑推荐】