里氏替换原则与多态的区别

什么是里氏替换原则

英文:Liskov Substitution Principle 缩写 LSP。中文解释:子类对象能够替换程序中的父类对象,且不会改变父类的行文。

多态

定义:父类引用可以指向子类实例,子类重写或者继承父类的全部方法。

例子说明

如果一个父类提供了提现的函数,且函数定义为账户余额不能小于等于0,但是根据用户分类的不同,可能存在vip用户继承了此父类,重写了体现函数,允许用户透支部分金额即可以在余额小于0时进行提现,则此时的子类提现行为对于父类来说改变了,此时违反了里氏替换原则,但还是多态。开发中常用判断是否是里氏替换原则的方式是单元测试:子类能通过父类的所有单元测试。

里氏替换原则多态是两个不同但又有一定关联的概念,它们并不完全等同。 多态是面向对象编程的一个重要特性,其表现形式有方法重载、方法改写、多态变量和泛型。重载是静态多态性,在编译时确定被调用的方法(早绑定);而多态变量和改写结合后,方法调用在运行时确定,是动态多态性(晚绑定)[^1]。多态强调的是同一个方法调用可以根据对象的实际类型执行不同的行为,允许不同的对象对同一消息做出不同的响应。 里氏替换原则由芭芭拉·利斯科夫(Barbara Liskov)提出,该原则指出:如果对每一个类型为 S 的对象 o1,都有类型为 T 的对象 o2,使得以 T 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 S 是类型 T 的子类型。简单来说,子类对象能够替换父类对象,并且不会影响程序的正确性和完整性。里氏替换原则更侧重于对继承关系的约束,确保子类能够完全替代父类,而不会破坏系统的原有功能。 二者的关联在于,多态是实现里氏替换原则的一种手段。通过多态的特性,子类对象可以在运行时替代父类对象,从而实现里氏替换原则的要求。但里氏替换原则不仅仅关注于方法调用的多态性,还涉及到子类对父类行为的遵循和扩展的合理性。 以下是一个简单的 Java 示例,展示多态里氏替换原则: ```java // 父类 class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } // 子类 class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } } public class Main { public static void main(String[] args) { // 多态的体现 Animal animal = new Dog(); animal.makeSound(); // 里氏替换原则的体现 takeAnimal(new Dog()); } public static void takeAnimal(Animal animal) { animal.makeSound(); } } ``` 在这个示例中,`animal.makeSound()` 体现了多态,而 `takeAnimal` 方法可以接受 `Dog` 对象作为参数,体现了里氏替换原则,即 `Dog` 对象可以替换 `Animal` 对象而不影响程序的正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值