P3:里氏替换原则(LSP)

本文详细阐述了里氏替换原则(LSP)的概念,强调在面向对象编程中,子类应该能够替换父类而不影响程序的功能。通过具体案例,展示了如何在设计时遵循LSP,以实现软件的开放封闭原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

里氏替换原则(Liskov Substitution Principle),简称LSP.

一、定义:

美国计算机科学Barbara Liskov提出定义如下:

如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1代换o2时,程序P的行为没有变化,那么类型S是类型T的子类型。

引用基类(父类的)地方都可以用子类来替换,但是反过来就不行。比如,香蕉是水果,但是水果不一定是香蕉。由于基类可以使用子类类替换,因此在程序中尽量使用基类来定义对象,在运行时指向其子类。
里氏替换原则属于开闭原则的规范之一。

二、使用约束:

1、子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象(已实现)方法;
2、子类中可以添加特有方法(父类中不存在),此时则无法在以父类定义的对象中使用该方法,除非在使用的时候强转基类成子类进行调用;
3、当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松;
4、当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

在设计的时候,尽量将父类设计为抽象类或者接口,让子类继承父类或者实现父类中定义好的接口方法,子类实例在运行时替换父类实例。扩展新功能的时候,无需修改原有的子类代码。

三、学习案例:

// 抽象基类
public abstract class Fruits{
}
public class Banana extends Fruits{
}
public class Apple extends Fruits{
}
// 在水果商店中,设置水果的价格,只需要传入水果基类即可。
//这种方式方便扩展新的水果种类,而无须改变接口定义;
public class FruitShop{
    void resetPrice (Fruits fruits){
    }
}

里氏替换原则是实现开闭原则的重要规范之一,大家在开发过程多体会其中的妙处。

END.

在机器人操作系统(ROS)中,机器视觉是机器人感知和理解周围环境的关键技术。robot_vision功能包专注于这一领域,集成了多种视觉处理技术,包括摄像头标定、OpenCV库应用、人脸识别、物体跟踪、二维码识别和物体识别,极大地拓展了ROS在视觉应用方面的能力。 摄像头标定:作为机器视觉的基础,摄像头标定用于消除镜头畸变并获取相机的内参和外参。在ROS中,camera_calibration包提供了友好的用户界面和算法,帮助计算相机参数矩阵,为后续的图像校正和三维重建提供支持。 OpenCV:OpenCV是一个广泛使用的开源计算机视觉库,在ROS中扮演着重要角色。robot_vision功能包可能包含OpenCV的示例代码和节点,涵盖图像处理、特征检测、模板匹配和图像分割等功能,这些功能对机器人视觉系统至关重要。 人脸识别:ROS中的人脸识别结合了图像处理和机器学习技术。robot_vision可能集成了基于OpenCV的人脸检测算法,如Haar级联分类器或Adaboost方法,甚至可能包含深度学习模型(如FaceNet或SSD),帮助机器人实现人脸的识别和跟踪,提升人机交互能力。 物体跟踪:物体跟踪使机器人能够持续关注并追踪特定目标。在ROS中,通常通过卡尔曼滤波器、粒子滤波器或光流法实现。robot_vision功能包可能包含这些算法的实现,助力机器人完成动态目标跟踪任务。 二维码识别:二维码是一种高效的信息编码方式,常用于机器人定位和导航。ROS中的二维码包可用于读取和解析二维码,而robot_vision可能进一步封装了这一功能,使其更易于集成到机器人系统中。 物体识别:作为机器视觉的高级应用,物体识别通常涉及深度学习模型,如YOLO、SSD或Faster R-CNN。robot_vision功能包可能包含预训练的模型和对应的ROS节点,使机器人能够识别环境中的特
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值