vb.netsubstring:VB.NET的旅( 8)—接口

  “还有两种继承思路方法?”我是真正被VB.NET强大功能所折服了求知渴望驱使着我向大李露出了个最灿烂笑容“行了别傻笑了我告诉你不就成了”大李不禁也笑了起来

  “刚才我说到‘脆弱基类’时就提到实现继承最大问题就在于基类和派生类的间关系过于紧密还记得吧?基类实现细节往往会泄露出来这不是我们愿意看到封装情况所以有很多设计师就想尽思路方法来改进这问题其中最出名就是COM了

  “COM?我在VB6中经常用呀种组件形式呀”我不是太明白大李这和面向对象继承有什么关系?

  “你说不错正是通过组件这种封装方式我们就可以把实现继承局限于在组件内部使用而我们使用组件时就不用理会它内部是什么如何实现这就可以避免不可预测地对基类修改我们把利用组件组织思路方法称为面向组件设计但这也是种面向对象设计思路方法不过是更具强制性组件支持组件内部实现继承还支持接口继承

  “接口继承我不是太清楚不过接口我是清楚就是组件开放属性、思路方法和事件、公用变量定义思路方法我在VB6中也接触过接口编程不是太方便好象要把定义了思路方法却没有写实现过程类编译成DLL文件VB6会自动将它创建为接口不过只能是隐藏不是显式定义”我回忆了下说

  大李微微点了点头说:“从面向对象观点来看接口就是对象外观而对象实际工作方式就是实现把接口和实现分离开就是我们要进行封装动机用户只能通过接口来操作但是看不到具体实现代码

  大李顿了然后接着说:“VB.NET 以前 Visual Basic 版本可以使用接口但不能直接创建它们VB.NET 却是允许可以用 Interface 语句定义真正接口喔!”

  此言真让我大吃“我们也可以直接定义接口吗?”

  “当然”大李说“在VB.NET中和类接口也可以定义属性、思路方法和事件但正如我刚才说到和类区别接口并不提供实现现在接口是由类来实现并从类中被定义为单独实体

  大李手指在桌面上重重敲了加强了下语气:“我们可以这样来理解接口表示种约定实现接口类必须严格按其定义来实现接口每个方面有了接口就可以将功能定义为些紧密相关成员小组可以在不危害现有代码情况下开发接口增强型实现从而使兼容性问题最小化也可以在任何时候通过开发附加接口和实现来添加新功能虽然接口实现可以进化但接口本身旦被发布就不能再更改对已发布接口进行更改会破坏现有代码若把接口视为约定很明显约定双方都各有其承担义务接口发布者同意不再更改该接口接口实现者则同意严格按设计来实现接口

  “也就是说在VB.NET中接口是用类来实现就象是个抽象类只是关键字用是Interface不是对吗?”我还是很好奇

  “接口实现可以是类也可以是结构接口定义用是Interface关键字实现时用是Implements关键字”大李淡淡句话使我在心中开始回忆起类和结构差别来(详见前文类和结构)

  大李接着跟我解说:“接口成员包括其成员声明引入成员和从其基接口继承成员只有嵌套类型、思路方法、属性和事件才能作为接口成员思路方法和属性不能有实体接口成员隐式地定为是Public而且不能指定访问修饰符接口自已倒是可以添加修饰符”大李跟着看了我就在电脑上开始写起举例来:

Public Interface IHenry 
  Sub subX(ByVal x As Integer) 
  Function fcnY(ByVal y As Integer) As Long 
  Property proZ As String 
End Interface 
Public Class CHenry 
  Implements IHenry 
  Private z1 As String 
  Sub subX(ByVal x As Integer) Implements IHenry.subX 
    '填写实现代码 
  End Sub 
  Function fcnY(ByVal y As Integer) As Long Implements IHenry.fcnY 
    '填写实现代码 
  End Function 
  Property proZ As String Implements IHenry.proZ 
    Get 
      Return z1 
    End Get 
    Set(ByVal Value As String) 
      z1 = Value 
    End Set 
  End Property 
End Class 


  大李指着代码说:“你看我用Interface定义了个接口IHenry(笔者注:般来说接口命名第个字母为I这并没有什么强制含义但却是个通用命名规则)内含 3个思路方法和属性定义但并没有实现;实现代码写在 CHenry类中你可以按我刚才说约定思路来理解IHenry接口其实就是个合约提纲CHenry是该合约个操作版本只要在 CHenry中实现了接口IHenry定义所有思路方法不管是如何实现有没有加入新思路方法都可认为CHenry是支持IHenry接口个实现类

  “个实现类?也就是说接口可以有多个实现喽?”我不解地问

  “当然我刚才说过接口其实就是个对象外观在VB.NET中有很多很重要接口定义了很多种类型对象比如说你所熟悉Windows FormControl控件它们基类大部分是Component类而Component类就是IComponent接口个实现类IComponent类还有其它 3个实现类那就是:Control、HttpApplication和MarshalByValueComponent类分别完成区别功能但它们都要实现IComponent接口所定义思路方法和属性且参数定义和返回类型都要和接口定义时签名换个角度来看这个问题我们如何创建个组件且让系统都识别就是对接口实现要成为组件类必须实现 IComponent 接口并提供不需要参数或只需个类型为 IContainer 参数基本构造就行了



  “哦我明白了通过接口我们可以定义下某种对象基本外观然后可以自由地进行实现和扩展却不涉及对原型直接修改太棒了!”我下子高兴了起来

  “是呀在VB.NET中可以显式定义接口使得接口编程也成为很棒编程方式了刚才所说在区别类中实现同个接口不就是种用接口实现多态性吗?另外在类和结构中也可以实现多个接口”大李写了如下代码给我看:

Interface IOne 
   Sub SubOne 
End Interface 
Interface ITwo 
   Sub SubTwo 
End Interface 
Class CHenry 
   Implements IOne 
   Implements ITwo 
   Sub SubOne Implements IOne.SubOne 
    '实现代码 
   End Sub 
   Sub SubTwo Implements ITwo.SubTwo 
    '实现代码 
   End Sub 
End Class 


  “真有意思”我饶有兴致地看着代码“也就是说CHenry就具备了IOne和ITwo所定义外观特点了

  我下子想起了抽象类定义不由好奇地说:“如果把接口看成个基类那么用于实现类不就可以看成是它个派生类了?这是不是就是接口继承呀?”



Tags:  vb.netsubstring

延伸阅读

最新评论

发表评论