oo中的继承性的思考和说明

1、继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些七月,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。

2、继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障。

3、问题提出:在编程中,如何正确的使用继承? 答:尽可能遵循里氏替换原则。

基本介绍

1、里氏替换原则在1988年,由麻省理工学院的一位姓里的女士提出的。

2、如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得T1定义的所有程序p在所有的对象o1都代换成o2是,程序p的行为没有发生变化,那么类型T2是类型T1的子类型。换句话说,所有,所有应用类型的地方必须能透明地使用其子类的对象。

3、在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。

4、里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题。

应用案例

没有使用里氏替换原则

public class Liskov {

public static void main(String[] args) {

A a = new A();

System.out.println("1-8=" + a.func1(1, 8));

System.out.println("--------------------");

B b = new B();

System.out.println("11-3=" + b.func1(11, 3));

System.out.println("1-8=" + b.func1(1, 8));

System.out.println("11+3+9=" + b.func3(11, 3));

}

}

class A {

// 两个数的差

public int func1(int num1, int num2) {

return num1 - num2;

}

// 两个数的积

public int funcBase(int num1, int num2) {

return num1 * num2;

}

}

//B类继承了A

//增加了一个新功能,完成两个数相加,然后和9求和

class B extends A {

// 这里,重写了A的方法,可能是无意识

public int func1(int a, int b) {

return a + b;

}

public int func3(int a, int b) {

return func1(a, b) + 9;

}

}

使用里氏替换原则

public class Liskov {

public static void main(String[] args) {

A a = new A();

System.out.println("1-8=" + a.func1(1, 8));

System.out.println("--------------------");

B b = new B();

System.out.println("11-3=" + b.func1(11, 3));

System.out.println("1-8=" + b.func1(1, 8));

System.out.println("11+3+9=" + b.func2(11, 3));

// 使用组合来使用A的相关方法

System.out.println("--------------------");

System.out.println("11-3=" + b.func3(11, 3));

System.out.println("1-8=" + b.func3(1, 8));

System.out.println("11+3+9=" + b.func2(11, 3));

}

}

class Base {

// 把更加基础的方法和成员写到Base类

// 两个数的积

public int funcBase(int num1, int num2) {

return num1*num2;

}

}

class A extends Base {

// 两个数的差

public int func1(int num1, int num2) {

return num1 - num2;

}

}

//B类继承了A

//增加了一个新功能,完成两个数相加,然后和9求和

class B extends Base {

// 如果B需要使用A类得方法,使用组合关系

private A a = new A();

// 这里,重写了A的方法,可能是无意识

public int func1(int a, int b) {

return a + b;

}

public int func2(int a, int b) {

return func1(a, b) + 9;

}

// 使用A得方法

public int func3(int a, int b) {

return this.a.func1(a, b);

}

}

上面这段代码中,使用了里氏替换原则,将更基础的方法funcBase()提取出来,然后将A类和B类继承这个更基础的Base类,采用依赖、聚合或耦合的方式来减少父类和子类的耦合

java里氏替换原则例子_java设计模式学习笔记——里氏替换原则相关推荐

  1. 设计模式学习笔记:六大原则

    单一职责里氏替换依赖倒置接口隔离迪米特法则开闭 设计模式有六大法则. 1.单一职责 这好理解,每个类只干一样事情 2.里氏替换 子类可以扩展父类的功能,但不要修改父类的功能.意为: 1)子类可以实现父 ...

  2. java给界面添加滚动条_Java Swing学习笔记:要求会默写或熟练的,GUI,控件,设置列或行,加滚动条,新界面...

    GUI:Java的图形化用户界面 学习其控件的使用 JLabel(文本控件),JTextField(文本框),JPassworldField(密码框),JButton(普通按钮) JRadioButt ...

  3. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  4. java/android 设计模式学习笔记(6)---适配器模式

    这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...

  5. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

  6. java/android 设计模式学习笔记(3)---工厂方法模式

    这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...

  7. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  8. java/android 设计模式学习笔记(1)---单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  9. java设计模式学习笔记之装饰模式

    java设计模式学习笔记之装饰模式 尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697 这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧& ...

最新文章

  1. 使用Uboot启动内核并挂载NFS根文件系统
  2. CentOS7下Hive集群搭建
  3. python更改数据框指定位置的数据_python – 更改数据框中多个loc的最快方法
  4. 科学存储数据格式-HDF5
  5. 使用Spring WebFlux从Corda节点流式传输数据
  6. oracle大于条件,oracle中sql语句中的in的条件数量大于1000有问题
  7. 清华大学python视频_涨见识了,清华大学全套Python579集视频教程泄露,拿走学去吧...
  8. java 后台 小程序微信支付
  9. Java基础篇:去探索String类
  10. java获取时间日期代码
  11. 计算机会计学实验报告,计算机会计学实验报告5(UFO报表管理).docx
  12. 监狱干警定位管理系统
  13. Python下载和安装图文教程[超详细]
  14. react异常 Each child in a list should have a unique “key” prop
  15. 详解DFT的scan(边界扫描)
  16. IOS取消“橡皮筋“效果
  17. Java实现 蓝桥杯VIP 算法训练 步与血(递推 || DFS)
  18. Poser 2014 PRO SR1 资料收集
  19. MFC动态创建Picture Control
  20. centos发现网络连不上了,重启网络服务报错“systemctl status network.service” and “journalctl -xe” for details. [失败]

热门文章

  1. 佛系计算机二级 第四弹
  2. tp5 分表+ 分页查询
  3. 计算机硬件无法组成部分,电脑硬件有哪些
  4. unity实现弓箭轨迹
  5. 哔哩哔哩(上海)开发实习生(Java方向)面试复盘和答案总结
  6. Tkinter个人音乐播放器及碰到的一些问题
  7. win7安装计算机的更新,Win7电脑提示部分更新没有安装怎么办?
  8. 职称计算机考试word2003,最新职称计算机考试Word2003操作练习
  9. 哪款蓝牙耳机性能最好?国产无线蓝牙耳机品牌推荐
  10. 在微软的Word中使用输入法打字,发现文字候选框在右上角,这种情况可能需要点击一下键盘上的Insert按键