对象的可替换性
来源:互联网 发布:acrobat for mac 破解 编辑:程序博客网 时间:2024/09/21 08:57
引子
对象的可替换性,这个概念是从父类子类那一块看到的,我开始看的也纳闷。比如形状是父类,子类有矩形、三角形、圆形、椭圆形等等。难道三角形可以替换圆形,苦思冥想好久,心想怎么可能啊。原来是是说子类可以替换父类,因为子类继承了父类的所有属性和方法同时可以自己扩充。就像儿子(子类)想装成爸爸的模样装上帅气的西装…….,但是父亲(父亲)不会(不能)去办成儿子,因为儿子继承了他的所有又有新的东西了。
但是在程序中创建对象的时候声明是父类但是实例化的时候是子类呢?
father = new son();
看下面的例子吧
例子
为啥不直接son= new son();
呢?
确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor:
package a.b;public class Monitor{public void displayText() {}public void displayGraphics() {}}
液晶显示器类LCDMonitor是Monitor的子类:
package a.b;public class LCDMonitor extends Monitor {public void displayText() { System.out.println("LCD display text");}public void displayGraphics() { System.out.println("LCD display graphics");}}
阴极射线管显示器类CRTMonitor自然也是Monitor的子类:
package a.b;public class CRTMonitor extends Monitor {public void displayText() { System.out.println("CRT display text");}public void displayGraphics() { System.out.println("CRT display graphics");}}
等离子显示器PlasmaMonitor也是Monitor的子类:
package a.b;public class PlasmaMonitor extends Monitor {public void displayText() { System.out.println("Plasma display text");}public void displayGraphics() { System.out.println("Plasma display graphics");}}
现在有一个MyMonitor类。假设没有向上转型,MyMonitor类代码如下:
package a.b;public class MyMonitor {public static void main(String[] args) { run(new LCDMonitor()); run(new CRTMonitor()); run(new PlasmaMonitor());}public static void run(LCDMonitor monitor) { monitor.displayText(); monitor.displayGraphics();}public static void run(CRTMonitor monitor) { monitor.displayText(); monitor.displayGraphics();}public static void run(PlasmaMonitor monitor) { monitor.displayText(); monitor.displayGraphics();}}
可能你已经意识到上述代码有很多重复代码,而且也不易维护。有了向上转型,代码可以更为简洁:
package a.b;public class MyMonitor {public static void main(String[] args) { run(new LCDMonitor()); //向上转型 run(new CRTMonitor()); //向上转型 run(new PlasmaMonitor()); //向上转型}public static void run(Monitor monitor) { //父类实例作为参数 monitor.displayText(); monitor.displayGraphics();}}
1 0
- 对象的可替换性
- 对象的可替换性
- 可替换的图标
- 对象私有数据的可访问性
- js对象的可枚举性
- 可定制替换规则的文本替换器
- 可删除的对象
- 可删除的对象
- 可过期的对象
- 可替换友盟的统计
- Python的可调用对象
- 可移植的线程对象
- Python的可调用对象
- python的可调用对象
- 谈面向对象编程的可替代性
- JS中对象属性的可枚举性
- 可替换系统(alternatives system)的应用浅议
- 可替换系统(alternatives system)的应用浅议
- Android 浅谈 Activity(中)
- SharedPreferences入门
- poj--2449 Remmarguts' Date(k短路)
- [LeetCode]344. Reverse String&345. Reverse Vowels of a String&151. Reverse Words in a String
- erro:armeabi-v7a\devices.xml cvc-complex-type.2.4d发现了一下元素d:skin 开头的无效内容.......
- 对象的可替换性
- 用newlisp做数学统计
- 【第三周】第三章实验1计算电费
- 聊聊高斯函数
- 在Linux CentOS 上安装Python 2.7.9
- Verilog语法_1(reg、wire、always语法)
- StringBuffer与StringBuilder
- 雪水当量数据(EASE-Grid Data)处理方法
- [Machine Learning]--PMI(Pointwise Mutual Information)