分享
 
 
 

Henry的VB.NET之旅(九)—接口继承

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

Henry的VB.NET之旅(九)—接口继承

韩睿

大李拍了拍我的肩膀说:“你真有想象力,不过的确,有很多文献把这种用Implements来实现接口的方法就称为接口继承。其实,接口自己也是可以进行继承的,在VB.NET中把接口间的继承形式称为接口继承。”

我不禁跟着笑了起来:“接口继承要成为继承,当然要用Inherits,对吧?”

大李点点头说:“既然你都清楚了,那你来模拟一个下拉框Combobox的接口吧。”

“Combobox?”我不禁一愣,不过一会就想明白了,“是不是要让它符合有文本框供文字输入与下拉列表供选择列表项的组合形式这样的外观?”

大李跟着提醒了我一句:“接口与VB.NET中的类继承还是有不同的,它可以支持从多个接口进行多重继承,VB.NET中的类只支持单一基类的继承。”

见大李没什么别的意见,我就开始写起代码来:

Interface IControl

Sub Paint()

End Interface

Interface ITextBox

Inherits IControl

‘在文本框设置文本

Sub SetText(ByVal text As String)

End Interface

Interface IListBox

Inherits IControl

‘在下拉列表设置列表项

Sub SetItems(ByVal items() As String)

End Interface

Interface IComboBox

Inherits ITextBox, IListBox

End Interface

Class CHenry

Implements IComboBox

Sub SetText(ByVal text As String) Implements ITextBox.SetText

'实现代码

End Sub

Sub SetItems(ByVal items() As String) Implements IListBox.SetItems

'实现代码

End Sub

……

写到这,发现CHenry类中的Implements IcomboBox的ICombobox下面还有一条波浪线,说明接口并没有实现完毕,可是我已经把IComboBox继承的两个基接口中的方法都已经实现了呀。把鼠标靠近波浪线一看,系统提示“必须为接口IControl实现sub Paint()”,于是我就继续写:

Sub Paint() Implements IControl.Paint

'实现代码

End Sub

End Class

我转回头问大李:“接口的实现类中是不是要把接口的所有基接口都要实现一遍呀?”

大李点点头说:“如果象这个演练中的情况,当然是要把基接口中没有实现的方法进行实现。但也要注意,实现接口的类或结构会隐式地实现该接口的所有基接口。如果一个接口在基接口的可传递闭包中多次出现,它的成员只参与一次构成派生接口。实现派生接口的类型只需实现一次多次定义的基接口方法。所以你也可以用Sub Paint() Implements ITextbox.Paint或是Sub Paint() Implements IListBox.Paint来代替,但只能用这三个定义中的一个。你再来看这段代码。”大李开始修改起刚写好的代码来:

Interface IControl

Sub Paint()

End Interface

Interface ITextBox

Inherits IControl

‘在文本框设置文本

Sub SetText(ByVal text As String)

Shadows Sub Paint()

End Interface

Interface IListBox

Inherits IControl

‘在下拉列表设置列表项

Sub SetItems(ByVal items() As String)

End Interface

Interface IComboBox

Inherits ITextBox, IListBox

End Interface

Sub test(ByVal x As IComboBox)

x.Paint()

End Sub

“这里的x.Paint()是哪一个接口的方法?IControl是ITextBox?”大李一脸笑意,真是气人。但是,我应该可以回答上来的,我按类的隐藏的概念回忆了一下(详见前文《重载和隐藏》),哈,明白了,它当然是调用它直接被派生的那个基类中的方法呀。

“是ITextBox中的方法吧!”

“可以呀,不错!”大李简单地夸了我一句,然后喝了口水,继续说:“基接口的成员名称在继承分层结构的一条路径中被隐藏,但它在其它的路径中不会被隐藏,比如我们可以从IlistBox中去继承Icontrol中的Sub Paint()。”

“可是,在您的这个示例中的sub test里,x是接口的实例吗?可是,接口还没有实现呀?”我还是有问题要问。

“test方法其实可以接受任何将 IComboBox 实现为小部件参数的对象,即使对接口 IComboBox 的实现可能相差很大。”大李回答道。

“是不是说我们在使用的时候,可以用实现IComboBox接口的类,比如CHenry的一个实例去代替x?”

大李笑着说:“基本上差不多了,你自己慢慢考虑吧。还有个问题比较有意思:实现类中用于实现接口的方法或属性名倒不用与接口中定义的名字一样,只要参数列表与返回类型一致就行了。比如在CHenry中的sub Paint()如果更名为sub xxx()也是可以的,只要后面跟着Implements IControl.Paint就行了。命名一定要有规划,不然,接口继承中也会带来命名重复造成的问题,我们来看一下。”

Interface IHenry1

Property yyy() As Integer

End Interface

Interface IHenry2

Sub yyy(ByVal i As Integer)

End Interface

Interface IHenryDerived

Inherits IHenry1

Inherits IHenry2

End Interface

Sub test(ByVal x As IHenryDerived)

x.yyy(1)

x.yyy = 10

End Sub

“你看,在sub test()中,无论你按IHenry2中的定义方式来使用x.yyy(1),还是用IHenry1中的方式来使用x.yyy=10,集成编译器都会在它们下方打上波浪线,表示出错,是什么错呢?”大李一边问我,一边把鼠标靠近波浪线,出现了编译器的出错提示:

“yyy”在继承接口“IHenry1”与“IHenry2”之间不明确

“所以,我一直强调命名规则,对吧?”大李看了我一眼,“其实解决方法倒用不着去更改基接口中的方法与属性名。”

Sub test()

Dim x As IHenryDerived

CType(x, IHenry1).yyy = 10

CType(x, IHenry2).yyy(1)

End Sub

“哦,用强制类型转换就可以了。”我又学到一招,不禁暗自窃喜。但是我心里总是有一个不大不小的疙瘩,说来说去,这接口与抽象类可真的太象了。赶紧得问问:“大李哥,这接口与……”

“抽象类?”大李一口就接了上来:“别急,小伙子,看看几点了,该下楼吃午饭了。”

---------------------------------------------------------------

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

E-Mail: henry7685@hotmail.com

请访问本人专栏:http://www.csdn.net/develop/author/netauthor/Latitude/

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有