当前位置: 首页 > news >正文

C# Unity 面向对象补全计划 七大原则 之 里氏替换(LSP) 难度:☆☆☆ 总结:子类可以当父类用,牛马是马,骡马也是马

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正
本系列作为七大原则和设计模式的进阶知识,看不懂没关系

请看专栏:http://t.csdnimg.cn/mIitr,尤其是关于继承的两篇文章,本知识点与其密切相关

1.里氏替换原则(LSP)

里氏替换原则(Liskov Substitution Principle,LSP)是面向对象编程中的一个重要设计原则,它由芭芭拉·利斯科夫(Barbara Liskov)在1987年提出,这个原则的核心思想是:子类对象可以替换父类对象,而不会影响程序的正确性

说白了,就是子类可以当父类用,只要涉及到继承的类就都可以用里氏替换原则


2.举栗子

继承下的里氏替换

子类必须完全实现父类的方法,说到完全实现,是不是就联想到了抽象类?故以此为例

我有一个抽象父类Computer,有两个抽象方法,子类去要去实现

Computer noteBook = new NoteBook();
noteBook.SayName();
noteBook.OutName();public abstract class Computer{protected Computer() { }//抽象方法public abstract void SayName();public abstract void OutName();
}public class NoteBook : Computer {//1.子类必须完全实现父类的方法public override void OutName() {Console.WriteLine("5800x");}public override void SayName() {Console.WriteLine("5800x");}//2.子类可以有自己特有的方法public void SayMyName() {Console.WriteLine("笔记本");}//3.父类的行为在子类中仍然有效,下面这部分方法会抛出异常,所以违反了父对象的行为,视为无效//public override void SayName() {//    throw new NotImplementedException();//}
}

Q:这和继承不是没有区别吗?

A:其实,因为子类可以完全继承父类的这一特点,所以几乎看不出来区别

But!!!!!!!!!!!!!!!!!!!!注意这一行代码:

我用父类的类new了一个子类的对象出来,还能正常用,这就是里氏替换

3.优点

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 论文解读 | ACL 2024:自我蒸馏在语言模型微调中架起分布差异的桥梁
  • PyTorch深度学习实战(4)—— Tensor的基本操作
  • 锐捷RCNA | 远程登录与路由技术
  • Python获取Excel内容
  • 用Manim计算和可视化某个函数图的微分切割线
  • 网站或者网页Cookie 启用说明
  • 成都云飞浩容文化传媒有限公司共绘电商服务新蓝图
  • Mistral AI:欧洲AI新星的崛起之路
  • 笔记:Java生产环境服务器卡顿排查
  • AppBoot:像 Django 一样使用 FastAPI
  • 记录|如何统一管理多个同一个对象?
  • Apache Kylin 系列入门教程
  • datawind可视化查询-日期函数
  • 基于XxlCrawler的Java执行JS渲染方式实战-以获取商飞C919飞行照片为例
  • 【学习笔记】Day 4 - Day 5
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CSS相对定位
  • js 实现textarea输入字数提示
  • nodejs:开发并发布一个nodejs包
  • SpiderData 2019年2月23日 DApp数据排行榜
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 程序员该如何有效的找工作?
  • 力扣(LeetCode)21
  • 浏览器缓存机制分析
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端学习笔记之观察者模式
  • 如何设计一个比特币钱包服务
  • 如何优雅地使用 Sublime Text
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用agvtool更改app version/build
  • 以太坊客户端Geth命令参数详解
  • 用jQuery怎么做到前后端分离
  • 鱼骨图 - 如何绘制?
  • 怎样选择前端框架
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​低代码平台的核心价值与优势
  • #100天计划# 2013年9月29日
  • (+4)2.2UML建模图
  • (1)svelte 教程:hello world
  • (2)MFC+openGL单文档框架glFrame
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (Java入门)抽象类,接口,内部类
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一) springboot详细介绍
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一一四)第九章编程练习