您现在的位置: 无忧电子商务网 >> 信息学院 >> 程序开发 >> js >> 正文

合成 VS 继承

作者:作者:未…    信息学院来源:网络收集    点击数:    更新时间:2006-8-27 我要参与讨论

  昨儿看到一片比较 继承与合成 的文章,不错,翻译出来大家共享。
内容浅显易懂,相信你也能从中有所收获

BTW:翻译的不好不要骂啊,嘿嘿。。。



合成 VS 继承
关联class的两种基本途径的对比
作者:Bill Venners
出处:http://www.artima.com/designtechniques/compoinh.html


摘要
这是我的Design Techniques的一部分,这里我分析了两者的构成(flexibility)和执行牵连(performance implications),并且我针对两者分别给出了指导方针。

正文
建立两个类之间的关联是软件设计的众多基本行为之一。继承和合成是两种基本的实现方法。尽管当你使用继承的时候JVM可以帮你做很多事情,但是你仍然可以使用合成来达到同样的目的。本篇将比较这两种途径且给出使用它们的指导方针。
    首先,介绍继承和合成的背景

关于继承
    Class Fruit {......}
    Class Apple extends Fruit {......}

    Apple和Fruit通过extends关联起来,苹果是水果的一种。Fruit是Apple的supperclass,Apple是Fruit的subclass

关于合成
    class Fruit {......}

class Apple {
    private Fruit fruit = new Fruit();
    //......
}

    这里Apple和Fruit通过合成关联起来,因为Apple拥有一个引用Fruit对象的实例变量。Apple被称为front-end class,Fruit被称为 back-end class。

动态绑定,多态和改变
当你使用继承来关联两个类的时候,你就可以利用动态绑定和多态的好处了。

动态绑定和多态最主要的好处之一是,他们可以帮助你更简单的修改代码,包括添加新的子类。然而这些不能包括所有你需要改变的地方


修改superclass接口
在继承关联中,superclasses通常被称为“脆弱的(fragile)”,因为对superclass的一点点的改动将波及到众多应用程序的代码。说的更明白些,superclass最脆弱的是它的接口。如果superclass是well-designed的――良好的接口设计,OO风格的实现,那么任何supperclass的实现的改变将不会有任何影响。如果修改superclass的接口,那么将波及到任何使用该superclass的地方和其subclass。
    继承有时被成为提供“弱封装(week encapsulation)”,因为你直接使用subclass的地方都会受superclass接口的改变的影响。从某个角度来讲,继承是让subclass重用superclass的代码。


选择合成?
继承性的关联很难来修改superclass的接口。合成则提供了easier-to-change的途径。
通过继承的代码重用
  class Fruit {
    //返回切割后的份数
    public int peel() {
      System.out.println(“Peeling is appealing”);
      return 1;
    }

    //将上面替换掉的新方法
    public Peel peel() {
      return new Peel(1);  //另外一个类
    }
  }

  class Apple extends Fruit {
  }

  class Example1 {
    public static void main(String[] args) {
      Apple apple = new Apple();
      int pieces = apple.peel();   //这里受到影响
    }
  }

Example1中通过Apple来调用继承自Fruit的peel()方法,但是当我们需要将peel()的返回值从int修改为Peel的时候(上面红色部分),问题出现了,由于类型的不匹配(int peel)造成Example1的代码不能通过编译,虽然Example1并没有和Fruit有任何直接的关联,但还是受到了很大影响。

通过合成的代码重用
合成通过在Apple中保持一个Fruit对象的引用,在Apple中声明一个新的peel方法,内部实现只是简单的调用Fruit的peel方法。

  class Fruit {
    //返回切割后的份数
    public int peel() {
      System.out.println(“Peeling is appealing”);
      

[1] [2] [3] 下一页

在google里搜索更多合成 VS 继承

Google
Web www.51ec.org
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
我来说两句 对此文章发表了评论
  昵 称: *必填    ·注册用户·
  评 分: 1分 2分 3分 4分 5分     严禁发表危害国家安全、政治、黄色淫秽等内容的评论,用户需对自己在使用本网站服务过程中的行为承担法律责任。本站管理员有权保留或删除评论内容,评论内容只代表机友个人观点,与本网站立场无关。  
评 论
内 容

 
评论列表 (最新 评论仅限网友观点!)

推荐文章
  • 此栏目下没有推荐信息学院
  • 供求信息




    | 设为首页 | 加入收藏 | 关于我们 | 广告服务 | 联系方式 | 友情链接 | 版权申明