大话设计模式之面向对象基础篇(三)

来源:互联网 发布:stoll制版程序员招 编辑:程序博客网 时间:2024/05/16 18:20

  继大话设计模式之面向对象基础篇(一)和大话设计模式之面向对象基础篇(二)后,本书还讲解了其他内容,本文总结多态、重构、抽象类和接口的相关知识。

多态

  多态是面向对象的第三大特征,表示不同的对象可以执行相同的动作,但是要通过他们自己的实现代码来执行。

  书中举例是“京剧父子”,父亲临时有事耽搁不能上台表演,但是这个演出又势在必行,这样的情况下,由模仿能力很强的儿子化妆后代替父亲上台表演。

  这里需要注意几点:(1)子类以父类的身份出现;(2)子类在工作时以自己的方式来实现,模仿得再好,也是模仿,儿子只能用自己理解的表现方式去模仿父亲的作品;(3)子类以父类的身份出现时,子类特有的属性和方法不可以使用,即自己再有绝活也不能使用,谨防“露馅”。同样的道理,要是每一个儿子都会模仿老爸表演,只是模仿是的方式不一样,这样的话就是多态

  例如下面的例子,先让Animal有一个Shout的虚方法,然后让Cat去重写Shout,达到多态(李代桃僵)的目的~

class Animal{             public virtual string Shout()   //Virtual表示此方法是虚方法,可以被子类重写    {        return "";    }}


class Cat : Animal{    public Cat()        : base()    { }    public Cat(string name)        : base(name)    { }    public override string Shout()    //用override进行方法重写    {        string result = "";        for (int i = 0; i < shoutNum; i++)            result += "喵 ";        return "我的名字叫" + name + " " + result;    }}

虚方法和重写

  为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的,通过在该成员的返回类型的前边添加Virtual关键字来实现。

  通常虚拟的是方法,只有字段是不能虚拟的。在那之后,子类可以选择使用override关键字,将父类实现替换为自己的实现,即方法重写——不同的对象可以执行相同的动作,但是要通过他们自己实现代码来执行。

  我的理解:挂羊头卖狗肉、李代桃僵,或许,理解为“一国两制”'更合适。

重构

  通过重估的方式来改善既有代码的设计,体现出敏捷开发的思想

  我的理解:根据外界所需相同操作的增多,将重复部分再次按照提公因式的方式,将公因式转移到父类成为虚方法,子类用的时候,调用即可。

class Animal{      public string Shout()    //去除Virtual,成为普通的公共方法    {        string result = "";        for (int i = 0; i < shoutNum; i++)            result += getShoutSound() + ",";     //虚方法 getShoutSound        return "我的名字叫" + name + " " + result;    }    protected virtual string getShoutSound() //“得到叫声”虚方法,让子类重写    {        return "";       }}

抽象类

  实例化后没有任何意义的叫做抽象类,抽象类往往是通过重构得来的,修饰符为abstract,同样的,方法也可以声明为抽象方法。

 (1)抽象类不能实例化;

 (2)抽象方法是必须被子类重写的方法(抽象方法可以看成是没有实现体的虚方法);

 (3)如果类中包含抽象方法,那么累就必须定义为抽象类(本质都变了,外在肯定也需要变,不然就表里不一了,即表里须如一)。

  抽象类通常代表一个抽象的概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的。

接口

  接口是把隐式公共方法和属性结合起来,以封装特定功能的一个集合,一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。

  声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式,故接口不能实例化、不能有构造方法和字段、不能有修饰符、不能声明虚拟的或静态的等。

  实现接口的类必须要实现接口中的所有方法和属性。

  接口中的方法或是属性前面不能有修饰符、方法没有方法体。

  我的理解:接口就是为了特殊功能的实现而产生的一种方案,就像是给那些有特殊权利和能力的人提供的“走后门”的机会。

抽象类和接口的区别

  从二者的形态上分:

 (1)抽象类可以给出一些成员的实现,接口却不包含成员的实现;

 (2)抽象类的抽象成员可以被子类部分实现,接口的成员需要实现类完全实现;

 (3)一个类只能继承一个抽象类,但是可以实现多个接口(可以走多个后门

  另外三点区分:

 (1)类是对对象的抽象;抽象类是对类的抽象;接口是对行为的抽象

  (2)如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类;

 (3)从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知道子类的存在,方法如何实现还不确定,预先定义。

   我的理解:接口的作用就是预知未来+未雨绸缪(行为接口)

对比记忆

抽象类和接口

  抽象类是自底向上抽象出来的,而接口是自顶向下设计出来的。

继承和泛化

  我的理解:意义相同,方向不同,泛化应该是从下向上的抽象过程,而继承应该是由上到下的沿用过程。

总结

  好了,考虑篇幅的问题就先总结到这里,真心觉得人一旦想要偷懒,创造力就是无穷的,愈发得感觉面向对象中的一切知识都是打着高效敏捷的口号进行的掩盖偷懒行为的冠冕堂皇的借口……

0 0
原创粉丝点击