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

本文探讨了面向对象设计中的Liskov替换原则(LSP),通过实例解释了为何子类应当能够替换父类,并讨论了继承的实现原理及其在.NET中的表现形式。此外,还分析了LSP的应用场景及违反原则可能导致的问题。

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

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

        之前写过了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()),后果可想而知了。

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

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值