从设计原则谈软件开发(三)

        今天被一个女生拒绝了,大受打击。来这继续把这个系列写下去。

        之前写过了OCP(开放封闭原则),SRP(单一职责原则)。今天的东西就稍微简单一些了。

        先来说LSP,他的具体翻译我记不住了,他的内容是子类必须可以替换父类。好像是叫子类替换原则。这个我不想太多解释了。我想学过面向对象的人都可以理解。继承中父类就是提取出子类中的共性,然后给提取出来,这样一来,子类必然可以替代父类。在这里,也许我们需要注意的也许仅仅是继承的选择上。我忘记了看到什么书上写的这样一段话。企鹅究竟是不是鸟,在现实生活中,企鹅是鸟。但是对于面向对象来说,企鹅却不是鸟。因为鸟这个父类应该有一个方法是Fly(),而企鹅却无法实现这个方法。

        在这里,顺便谈谈继承的实现原理吧。我们都知道,在元数据中,每个类都维护着一个属于他的方法表,当声明一个类的对象时,首先先向上遍历整个对象树上他的所有父类,然后CLR为每个类都创建出一个方法表,然后当我们实例化一个类时,比如People p=new Boy();那么就创建出了三个方法表,分别是Object ,People,Boy,然后将p的指针引用指向People的方法表。这时我们调用Eat()方法,如果在子类中只是隐藏(new)了该方法,那么在IL中就直接call这个方法。否则,如果在子类中重写了这个方法,那么这个时候,指针就会移动到子类,调用重写的方法,在IL中反映出来也就是callvirt。

        在这里,我们来分析一下LSP的目的,我们知道,我们使用父类的目的,不仅仅是为了少写代码,更重用的是为了可扩展,这也是面向对象的一个最大的优点。我们对一个概念一定不会陌生,多态。举一个最简单的例子:

      

1 List<People> peopleList=new List<People>();
2 peopleList.Add(new Boy());
3 peopleList.Add(new Girl());

 

         假设说我们把一个Bird的类继承自People,那么就会产生这样一句代码,peopleList.Add(new Bird()),后果可想而知了。

         要下课了,就写到这了,希望各位多多指教。

  

posted @   飞林沙  阅读(2108)  评论(12编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
点击右上角即可分享
微信分享提示