现在的位置: 首页 > 综合 > 正文

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

2012年10月19日 ⁄ 综合 ⁄ 共 951字 ⁄ 字号 评论关闭

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

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

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

  

抱歉!评论已关闭.