新秀翻译(一个)——Java在继承和组合
阅读英文的程序猿的能力,这是非常重要的。过去的几年中一直在学习英语,今天心血来潮,在网上找什么鲍文简要翻译。
普通级,能力有限,看官还请大家多多指点。
译文:
本文将会举例说明Java中继承和组合的概念。首先举一个继承的样例。然后展示一下怎样用组合来改善继承的设计。最后概括一下怎样在它们之间做出选择。
1. 继承
假设我们有一个Insect类。这个类包括两个方法:一个是move()。一个是attack()。
class Insect {
private int size;
private String color; public Insect(int size, String color) {
this.size = size;
this.color = color;
} public int getSize() {
return size;
} public void setSize(int size) {
this.size = size;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} public void move() {
System.out.println("Move");
} public void attack() {
move(); //assuming an insect needs to move before attacking
System.out.println("Attack");
}
}
如今你想定义一个Bee类,它是Insect类型的,可是有着不同实现的attack()方法和move()方法。
我们能够用继承来设计,例如以下所看到的:
class Bee extends Insect {
public Bee(int size, String color) {
super(size, color);
} public void move() {
System.out.println("Fly");
} public void attack() {
move();
super.attack();
}
} public class InheritanceVSComposition {
public static void main(String[] args) {
Insect i = new Bee(1, "red");
i.attack();
}
}
类层次结构关系图就是如此简单:
输出:
Fly
Fly
Attack
"Fly"被打印了两次,表示move()被调用了两次。可是它应该被调用了一次才对。
问题出在super.attack()方法上。Insect的attack()方法调用move()方法。当子类调用super.attack()时,总是会调用重写的move()方法。
我们能够用以下的方法解决问题:
- 去掉子类的attack()方法。
这将使子类取决于父类attack()方法的实现。假设父类中的attack()方法发生改变(这是你无法控制的),比如:父类的attack()方法使用其它的方式来实现,子类也须要跟着改变,这不是好的设计。
- 重写attack()方法,例如以下:
public void attack() {
move();
System.out.println("Attack");
}这样能保证正确的结果,由于子类不再依赖于父类 。然而。 代码变成了一个父类的复制品。
(想象一下,attack()方法远比打印一个字符串要复杂的多)这违背了软件project复用的原则。
这个继承的设计不好,由于子类依赖父类的详细实现,假设父类发生变化。子类将被破坏。
2. 组合
与继承相反,组合能够用于这样的情况。
让我们先看看使用组合的解决方法。
attack方法被抽象为一个接口。
interface Attack {
public void move();
public void attack();
}
能够对Attack接口进行多种不同的实现。
class AttackImpl implements Attack {
private String move;
private String attack; public AttackImpl(String move, String attack) {
this.move = move;
this.attack = attack;
} @Override
public void move() {
System.out.println(move);
} @Override
public void attack() {
move();
System.out.println(attack);
}
}
将attack方法抽出来,Insect就不再与attack相关联了。
class Insect {
private int size;
private String color; public Insect(int size, String color) {
this.size = size;
this.color = color;
} public int getSize() {
return size;
} public void setSize(int size) {
this.size = size;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
}
Bee是一个Insect的类型,它能够攻击。
// This wrapper class wrap an Attack object
class Bee extends Insect implements Attack {
private Attack attack; public Bee(int size, String color, Attack attack) {
super(size, color);
this.attack = attack;
} public void move() {
attack.move();
} public void attack() {
attack.attack();
}
}
类图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1c2h1aWppbmdlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
public class InheritanceVSComposition2 {
public static void main(String[] args) {
Bee a = new Bee(1, "black", new AttackImpl("fly", "move"));
a.attack(); // if you need another implementation of move()
// there is no need to change Insect, we can quickly use new method to attack Bee b = new Bee(1, "black", new AttackImpl("fly", "sting"));
b.attack();
}
}
fly
move
fly
sting
3. 何时用继承,何时用组合?
以下两条内容,能够告诉我们怎样在继承与组合之间做出选择:
- 假设存在一个“是”的关系,而且一个类要对还有一个类公开全部的接口。那么继承是更好的选择
- 假设存在一个“有”的关系,那么首选组合。
总之。继承和组合都有其用途,和理解他们的优缺点是非常有必要的。
最后说一点自己的感受吧。小弟自打初中開始学英语。成绩就没好过。最好成绩也就刚及格吧。记得当年高考的时候lz的英语成绩是55分(足以加载史冊的成绩),我的英文水平有多差,大家可想而知了吧。
后来承蒙恩师的谆谆教诲,一直没有放弃英语的学习。如今依旧每天都在学(尽管没有掌握其精髓。可是学总比不学强)。曾经遇到外国人根本张不开嘴。不知道说什么。如今好多了。之前常常跟老外一起踢球,没事瞎白话几句,感觉也挺好玩的。
曾经看到英文的文章,直接关掉,如今也能静下心来看下去了。
总之,学英语心态非常重要,仅仅要你不怕它,它就没什么好怕的。
毛主席曾说过:“All the reactionaries are the Papertiger(一切反动派都是纸老虎)”。
英语没什么好怕的。遇到老外你就跟他瞎扯呗,最不济你俩打个平手——谁也听不懂谁说什么。
还有更坏的结果吗?无论怎样咱都不会输。那你还怕啥?看英文文章、书籍看不懂。那就更不用怕了,大不了弄个词典呗。我大有道在手,还怕治不了你个小英文了。别犹豫了,上吧,少年!
新秀翻译(一个)——Java在继承和组合的更多相关文章
- java 中继承,组合,重载,重写的实现原理 (转)
我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...
- java的继承和组合
继承和组合是java中非常常用的两种创建新类型的方法,两者都能提高代码的复用率. 继承主要是想让子类继承父类的基本特性:组合技术通常用于想在新类中使用现有类的功能,而非它的接口.两者的分别是" ...
- java中继承和组合的区别
子类继承父类,父类的所有属性和方法都可以被子类访问和调用.组合是指将已存在的类型作为一个新建类的成员变量类型,又叫"对象持有". 通过组合和继承,都可以实现系统功能的重用和代码的复 ...
- [译]Java中的继承 VS 组合
(文章翻译自Inheritance vs. Composition in Java) 这篇文章阐述了Java中继承和组合的概念.它首先给出了一个继承的例子然后指出怎么通过组合来提高继承的设计.最后总结 ...
- 菜鸟译文(一)——Java中的继承和组合
阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和 ...
- Java中的继承与组合(转载)
本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...
- Java中的继承与组合
本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- Java继承与组合
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
随机推荐
- Cash Loan----:利用脚本自动化部署系统,解放我们的双手
[前言] 现在我们的项目发布(从git上拉代码部署到Linux上)是通过脚本来完成,生产和测试环境都是运维在控制,开发联调环境由开发来负责,之前开发环境每次部署都是先在本地打好jar包然后传到服务器上 ...
- Hadoop1.2.1伪分布模式安装指南 分类: A1_HADOOP 2014-08-17 10:52 1346人阅读 评论(0) 收藏
一.前置条件 1.操作系统准备 (1)Linux可以用作开发平台及产品平台. (2)win32只可用作开发平台,且需要cygwin的支持. 2.安装jdk 1.6或以上 3.安装ssh,并配置免密码登 ...
- 访问sharepoint站点自动使用当前用户名和密码登录
https://blog.csdn.net/zw_2011/article/details/7417123 1.把sharepoint站点添入可信站点. 点击菜单栏“工具”——〉“Internet ...
- 【35.43%】【hdu 4347】The Closest M Points
Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 98304/98304 K (Java/Others) Total Submissio ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(4)for == while ?
一.for和while等价替换 int i = 1; for (i; i<=100; i++){ sum = sum + 1; } int i = 1; while(i<=100){ su ...
- 转载:APP a打开b软件的附件
Importing & Exporting Documents in iOS Posted by weimenglee - 09 Aug 2011 https://mobiforge.com/ ...
- js一些编写的函数
第一:它是最常见的 function A(){ } 说明 A(); 第二: var B = function(){ } 方法 B();//这是匿名函数 第三: (function () { ...
- 小强的HTML5移动开发之路(24)—— PhoneGap Android开发环境搭建
有关JDK及Android开发环境的搭建请看我前面的博文:http://blog.csdn.net/dawanganban/article/details/9748497 一.下载PhoneGap 下 ...
- Eclipse Che安装依赖
java Java 用于运行Che的服务器和用于创建Plug-in包的SDK工具,所以需要安装Java Jdk 1.8 如果只是运行Che的话下载JRE就足够了,但是加入你需要从源代码编译的话你还需要 ...
- 分位数和分位线(Quantiles and Percentiles)
分位数有种积分(累积)的含义在. 分位数(即将数据由低至高排列,小于该数的数据占总体的比例达到时最终落到的数): 10%:3000元 20%:5200元 50%:20000元 80%:41500元 9 ...