分享
 
 
 

VB.NET是怎样做到的(五、六)

王朝vb·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

VB.net是怎样做到的(五)——实现接口

VB.net采用的实现接口的语法是VB5发明的Implements,这个实现接口的语法在当今主流语言中独一无二。比如我有两个接口:

Interface Interface1

Sub Test()

End Interface

Interface Interface2

Sub Test()

End Interface

这两个接口有一个完全一样的成员Test。假设我需要用一个类同时实现两个接口会怎么样呢?先想想看,如果是Java,JScrip.NET这样的语言就只能用一个Test函数实现两个接口的Test成员。假如两个Test只是偶然重名,其内容必须要分别实现怎么办,于是一些解决接口重名的设计出现了……。在VB中,独特的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的Implements语句都是这样的原理。也就是说.NET提供了换名实现接口成员的功能,但是只有VB将这个自由让给了用户,而其他语言还是采用了经典的语法。

VB.NET是怎样做到的(六)——默认属性和属性参数

在原先的VB6里,有一项奇特的功能——默认属性。在VB6中,对象的名称可以直接表示该对象的默认属性。比如TextBox的默认属性是Text,所以下面的代码

Text1.Text = "Hello"

就可以简化为

Text1 = "Hello"

这种简化给VB带来了很多麻烦,赋值运算就需要两个关键字——Let和Set,结果属性过程也需要Let和Set两种。而且这种特征在后期绑定的时候仍能工作。到了VB.NET,这项功能被大大限制了,现在只有带参数的属性才可以作为默认属性。如

List1.Item(0) = "Hello"

可以简化为

List1(0) = "Hello"

这种语法让有默认属性的对象看起来像是一个数组。那么VB怎么判断一个属性是否是默认属性呢?看下列代码

Public Class PropTest

Public Property P1(ByVal index As Integer) As String

Get

End Get

Set(ByVal Value As String)

End Set

End Property

Default Public Property P2(ByVal index As Integer) As String

Get

End Get

Set(ByVal Value As String)

End Set

End Property

End Class

P1和P2两个属性基本上完全相同,唯一的不同是P2带有一个Default修饰符。反汇编这个类以后,可以发现两个属性完全相同,没有任何差异。但是PropTest类却被增加了一个自定义元属性System.Reflection.DefaultMemberAttribute。这个元属性指定的成员是InvokeMember所使用默认类型,也就是说后期绑定也可以使用默认属性。可是我试验将DefaultMember元属性手工添加到类型上却不能达到让某属性成为默认属性的功能。看来这项功能又是VB的一项“语法甜头”。但是,VB或C#的编译器对别人生成的类的默认属性应该只能通过DefaultMemberAttribute来判断,所以我将一个VB类只用DefaultMemberAttribute指定一个默认方法,不使用Default,然后将它编译以后给C#用,果然,C#将它识别为一个索引器(indexer)!

既然说到了C#的索引器,我们就顺便来研究一下VB和C#属性方面的不同。刚才的实验结果是VB的默认属性在C#中就是索引器。但是VB仍然可以用属性的语法来访问默认属性,而C#只能用数组的语法访问索引器。更特别的是,VB可以创建不是默认属性,但是带有参数的属性,如上面例子里的P1,而C#则不支持带参数的属性,如果将VB编写的,含有带参数属性的类给C#用,C#会提示“属性不受该语言支持,请用get_XXX和set_XXX的语法访问”。也就是说,带参数的属性是CLR的一项功能,但不符合CLS(通用语言规范),因此就会出现跨语言的障碍。这也更加深了我们对CLS的认识——如果你希望让你的代码跨语言工作,请一定要注意符合CLS。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有