vb.netsubstring:VB.NET的旅(十)—何时用接口

  大李没告诉我接口和抽象类区别什么时候用接口什么时候用实现继承弄得我中饭也没吃好老在琢磨这事这不吃完饭我就冲上楼个房间个房间转到处找大李

  过了好这老哥才和几个同事说说笑笑地回到办公室我立即走上前半请半拉地把他拽到电脑旁“大李哥我实在想得头晕既然在VB.NET中接口有了这么大发展空间在形式上和抽象类如此相似那么它们有什么区别?什么时候用接口呢?”

  听着我连串问题大李微笑着摇摇头拍拍我肩膀说:“小兄弟不光是你弄不清其实就是很有经验设计师也对什么时候用接口什么时候用抽象类而头痛咧

  此话我更是疑惑重重不过反而安下心来老鸟们都弄不清问题我不清楚也不必心中不安了哈……

  大李看着我忽忧忽喜表情露出了丝诧异不过他没有理会继续说:“但是这个问题我们还是有必要好好分析让我们更明白接口和抽象类具体含义

  “我们早说过抽象类是种不能例子化而必须从中继承抽象类可以完全实现但更常见是部分实现或者根本不实现从而封装继承类通用功能它可以提供已实现成员因此可以用抽象类确保特定数量相同功能但不能用接口这样做

  “接口是完全抽象成员集合成员都无法在接口定义时实现我们可以将它看作是为操作定义合同接口实现完全留给开发者去做它们的间区别如果认真分析还是有不少:在VB.NET中类只能是从个基类继承所以如果要使用抽象类为组类提供多态性这些类必须都是从那个类继承;接口就不样了它不但可以用个类或结构实现多个接口个接口还可以有多个实现

  “也就是说它们在提供多态性问题上是有差别?”我好象听懂了点什么

  “这是个重要区别我们也可以从多态性角度来考虑是要使用接口还是用抽象类”大李同意了我观点“如果预计要创建组件多个版本我们应该创建抽象类这是抽象类提供简单易行思路方法来控制组件版本通过更新基类所有继承类都随更改自动更新这是好处当然也是问题对吧?(详见前文脆弱基类)另方面接口旦创建就不能更改如果需要接口新版本必须创建个全新接口所以如果创建功能将在大范围全异对象间使用则使用接口

  我想了接着大李话说:“能不能这样说抽象类主要用于关系密切对象而接口最适合为不相关类提供通用功能

  大李对我伸出了大拇指:“不错小伙子悟性很好呀!你想我上午跟你说要创建Control控件首先就是要对些接口进行实现以让系统能够识别(详见前文接口)而各个Control控件的间联系其实关联性并不大所以它们基础大都是接口但是我们要注意在组件设计时如果要在组件所有实现间提供通用已实现功能则使用抽象类这是我们刚才说过原因抽象类允许部分实现类而接口不包含任何成员实现

  “唔明白了它们的间区别有点明白了”我默默地点了点头

  “另外有个通用设计思想如果要设计小而简练功能块则使用接口如果要设计大功能单元则使用抽象类”大李又补充了条建议

  “看来设计问题还是蛮大般来说如何设计接口呢?”我接着问

  “为什么你所看到编程书籍也好例程也好极少有对接口描述而对类实现继承例子比比皆是?这就从个侧面给我们提了个醒如果使用适当接口可以成为很有用工具但如果使用不当它们会变得非常棘手甚至妨碍有效编程接口设计和使用其实是项高明艺术”大李郑重其事

  “艺术?”我惊叫了

  “没错艺术!”大李又加重了下语气“通过接口和实现方式我们可以将同类型运用在区别对象上面而且不必修改原有类相对子必须通过修改源代码才能够达到重用接口和实现不仅是伟大进步也是境界极高设计艺术

  “哦这倒是真”我回想起今天看到接口例程

  “但是最大问题还是集中在接口设计上”大李接着说“接口旦被定义和接受就必须保持不变以保护为使用该接口而编写应用接口发布后就不能对其进行更改这是我们进行组件设计个重要原则叫做‘接口不变性’

  我点了点头:“接口不变性这个我可以理解了

  “我已经反反复复强调过创建个接口就是在创建个定义接口定义发布后则永远不能更改接口不变性就是为了保护为使用接口而编写现有系统当接口设计和需求有所出入确认需要大幅度变更时我们应该创建新接口般命名方式是新接口可以通过在原来接口名称后追加个数字‘2’来命名以显示出它和现有接口关系然后通过接口继承来创建新接口

  “可是如果需求分析得不好岂不是会出现大堆派生接口了?”我不免有点顾虑

  “这是肯定而且过于频繁地生成新接口会因未使用接口实现而使组件变得很庞大有经验设计师在充分分析需求后设计出接口往往很小且相互独立减少了性能问题发生可能

  “这种分解能力倒真是艺术呀!”我不禁为的叹服

  “当然般来说我们会把确定哪些属性和思路方法属于接口设计过程称为‘接口分解’基本准则是应在个接口中将紧密相关几个功能聚合为功能太多会使接口不便于运行而过于细分功能将导致额外系统开销并降低使用简易性掌握分解这个度能力是需要不断在技术上进行磨炼以及在对每个项目深入分析和理解基础上才能得到

  “明白了”我大声地回答着真希望自己能早天成为接口设计大师

  大李笑着拍了拍我:“明白了就好其实和设计接口相比创建大实现继承树更容易出错

  “当然”我脑海里浮现起实现继承各个环节“这是不是说在某些时候适当使用接口还是很有益

  “看来你真明白了那你再来说接口和类实现继承相比好处有什么?”大李回过身开始找茶杯

  我低下头努力地转动了下脑子:“我试着说下吧总体而言接口是种非常有效编程思路方法它让对象定义和实现分离从而可以在不破坏现有应用情况下使对象得以完善和进化接口消除了实现继承个大问题就是在对设计实施后再对其进行更改时很可能对代码产生破坏即使实现继承允许类从基类继承实现在类首次发布时仍然会使我们不得不为设计做很多抉择如果原有设想不正确并非总可以在以后版本中对代码进行安全更改比如我们定义了个基类思路方法它需要个 Integer 参数而后来又确定该参数应该为 Long 数据类型我们无法安全更改原始类为从原始类派生类所设计应用可能无法进行正确编译问题会扩大化单个基类会影响几百个子类



  “那用重载原始类并采用个Long类型参数不就能解决这个问题了吗?”大李提了个问题

  “这个么?”我想了“可是这样不定能达到满意效果个派生类可能需要对采用整数思路方法进行重写如果取 Long 数据类型思路方法不能被重写该派生类可能无法正常运行

  “那用接口如何做?”大李不依不挠地继续问

  “办法就是发布接受新数据类型更新接口”我下子就回答出来了

  “看来你已经掌握了接口操作基本环节了”大李评语真让我高兴“我再帮你整理总结使用接口继承而不用类继承主要原因有:在应用要求很多可能不相关对象类型以提供某种功能情况下用接口适用性会更强;接口比基类更灵活可以定义单个实现来实现多个接口;在无需从基类继承实现情况下接口更好;在无法使用类继承情况下接口是很有用例如结构无法从类继承但它们可以实现接口

  我抿着嘴用力点了点头同时在心里默默地记忆着大李所说条准则

  “回去好好想想多写几个小来练习明天我们还要欣赏VB.NET提供强大可视继承表现呢



Tags:  vb.netsubstring

延伸阅读

最新评论

发表评论