Java中的继承实现的契约含义
来源:互联网 发布:雅马哈电子琴淘宝便宜 编辑:程序博客网 时间:2024/05/07 14:03
并不是说给一个类取名为RECTANGLE就真能取代一个这个英文单词(矩形)能指代的概念的,一个英文单词有其默认的,隐含的契约,有可能与程序世界里想表达的概念不一致或有细微的差别。 public class Square extends Rectangle{ 我们学到了什么?
一个类或接口是被其契约定义出来的,而不是被其“名字”定义出来的。在阅读代码时要意识到虽然代码”可读”但是其语义下的契约并未实现或还是模糊的。不要一开始就建立空中楼阁的架构,设计者对其中的契约并未有具体的认识,这样的设计往往有潜在的缺陷。
不要仅仅从一个名字判断出其能如何被子类继承,例如,“马”能被“斑马”继承吗?
当你写下
public class Rectangle{}
时,可能你脑子里想的是矩形的契约“一个封闭的图形,有四个角,每个角度都是90度”,然后你开始实现这个类
public class Rectangle{
private int height;
private int width;
//setter
//getter
}
你的实现却完全聚焦到了矩形的长和宽上,却完全忽视了它们的契约”改变长度或者宽度不会互相影响”,注意,此时你并没有实现一个几何意义上的“矩形”,你实现的类与下面的类无异,
public class A{
private int i;
private int j;
}
隐患开始埋下……
当你被问到”正方形是一个矩形吗”?你脑子里闪过初中数学(高中数学??)“当然是!!!”,于是你继承了矩形
//...
public void setHeight(int height){
height = height;
}
public void setWidth(int width){
height = width; //!!! 父类的契约被违反了
}
}
public class Test {
test(){
Rectangle rec = new Squre();
rec.setHeight(4);
rec.setWidth(5);
assertEquals(20,rec.getHeigh()*rec.getWidth());// !!!fail, 结果为16!!!
}
}
一个类或接口是被其契约定义出来的,而不是被其“名字”定义出来的。在阅读代码时要意识到虽然代码”可读”但是其语义下的契约并未实现或还是模糊的。不要一开始就建立空中楼阁的架构,设计者对其中的契约并未有具体的认识,这样的设计往往有潜在的缺陷。
不要仅仅从一个名字判断出其能如何被子类继承,例如,“马”能被“斑马”继承吗?
“。。。当然可以”
就继承实现来说,如果子类要invalid父类的行为,就有可能违反LSP。反之,如果子类要大量扩展或新增父类行为,这又说明子类特化的太厉害,已经失去了父类的意味,读这个类已经想象不出父类大概是个什么样子,对于理解设计并未有什么帮助。
不要为了重用行为而继承一个类,可采用聚合/组合来实现。
1,不要包外继承,因为设计者无法控制其契约的变化。
2,不要继承包内不是为继承设计的类
3,尽量不要继承非抽象类
4,尽量继承抽象类
5,继承抽象类时不要添加太多行为
6,对于抽象类的设计,非抽象方法做成FINAL
7,记住,真正可适用实现继承的SCENARIO是很少,很苛刻的。
那么这个“马”能被“海马”继承吗?!!! (Gotcha!!!)
就继承实现来说,如果子类要invalid父类的行为,就有可能违反LSP。反之,如果子类要大量扩展或新增父类行为,这又说明子类特化的太厉害,已经失去了父类的意味,读这个类已经想象不出父类大概是个什么样子,对于理解设计并未有什么帮助。
不要为了重用行为而继承一个类,可采用聚合/组合来实现。
1,不要包外继承,因为设计者无法控制其契约的变化。
2,不要继承包内不是为继承设计的类
3,尽量不要继承非抽象类
4,尽量继承抽象类
5,继承抽象类时不要添加太多行为
6,对于抽象类的设计,非抽象方法做成FINAL
7,记住,真正可适用实现继承的SCENARIO是很少,很苛刻的。
- Java中的继承实现的契约含义
- WCF 服务契约的继承
- java 子类可以继承父类中的什么,子类中方法覆盖,final关键字的含义
- 第二章(契约 实现一个双向契约的客户端部分)
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java中的equals()和hashCode()契约
- Java继承的实现
- Oracle之sql标准之增删查改子句用法
- 文件的读取和保存
- c语言的代码
- POJ 2400 Supervisor, Supervisee (KM + 回溯) - from lanshui_Yang
- Day16_枚举、联合及贪吃蛇
- Java中的继承实现的契约含义
- opencv保存图像自动命名
- Day17_堆变量、qsort等函数使用
- 精选实用正则表达式
- 用adb设置sdcard的权限问题
- 【linux高级环境编程学习笔记一】管道通信
- zoj 1007 Numerical Summation of a Series 纯数学题
- TI DSP 位域寄存器文件结构的经典用法
- zedboard--基于demo系统的用户ip核的添加和驱动编写(书13.2完整实现过程)(二十一)