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

原创 2003年12月11日 11:42:00

?????? 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()是哪一个接口的方法?IControlITextBox?”大李一脸笑意,真是气人。但是,我应该可以回答上来的,我按类的隐藏的概念回忆了一下(详见前文《重载和隐藏》),哈,明白了,它当然是调用它直接被派生的那个基类中的方法呀。

“是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/

VB.net学习笔记(十二)继承中的构造、事件、共享方法、共享事件

Private mNames As Generic.Dictionary(Of NameType, String) Public Overloads Property Name(ByVal ...
  • dzweather
  • dzweather
  • 2013年08月13日 22:38
  • 5158

浅谈VB.NET中的接口

只支持单继承的VB.NET为了解决多继承的问题,引入了接口的概念。我们可以这样来为接口下一个定义:接口就是指只包含虚成员的虚类。 (1)        虚类,表明了接口是不能够被直接实例化的。也就...
  • action20
  • action20
  • 2014年01月02日 19:14
  • 1383

抽象类与接口之间的继承和实现关系

抽象类与接口之间的继承和实现关系        对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的...
  • wen1158646729
  • wen1158646729
  • 2015年08月13日 10:58
  • 5944

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

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

Henry的VB.NET之旅

  • 2011年08月31日 23:39
  • 850KB
  • 下载

Henry的VB.NET之旅

  • 2008年03月19日 21:11
  • 38KB
  • 下载

henry的vb.net之旅

  • 2009年04月29日 15:22
  • 937KB
  • 下载

henry的vb.net之旅.rar

  • 2008年03月12日 22:54
  • 937KB
  • 下载

VB.NET之旅(八)—接口

“还有两种继承方法?”我是真正被VB.NET的强大功能所折服了。求知的渴望驱使着我向大李露出了一个最灿烂的笑容,“行了,别傻笑了,我告诉你不就成了。”大李不禁也笑了起来。 “刚才我说到‘脆弱的基类’...
  • hao8986
  • hao8986
  • 2012年01月05日 14:48
  • 508

VB.NET之旅(十五)—动态事件处理方法?

“大李哥,”我不免为自己问了如此多的问题而不好意思起来,“您刚才所说的事件的委托是怎么回事呀?”   大李显然是明白我会提问的:“我所说过事件驱动设计中的三要素你还记得吧?”   “当然,...
  • hao8986
  • hao8986
  • 2012年01月05日 14:54
  • 443
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Henry的VB.NET之旅(九)—接口继承
举报原因:
原因补充:

(最多只允许输入30个字)