昨儿看到一片比较 继承与合成 的文章,不错,翻译出来大家共享。
内容浅显易懂,相信你也能从中有所收获
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”);
内容浅显易懂,相信你也能从中有所收获
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”);
| 对此文章发表了评论 |
