博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

二、面向对象设计三大特性-----《大话设计模式》

Posted on 2015-09-14 22:10  shanymen  阅读(803)  评论(0编辑  收藏  举报

一、封装

良好的封装能够减少耦合;类内部的实现可以自由地修改;类具有清晰的对外接口。比如建立一个猫的类,再建立一个狗的类,这样也算封装,只是会出现大量相似代码。

 

二、继承

继承的出现是因为对象类中出现过多重复代码,为解决该问题而建立父类,将这部分代码放进父类中,由子类继承。子类继承父类的所有特性,同时可以定义新的特性。

如果子类继承于父类,子类拥有父类非private的属性和功能;子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;子类还可以以自己的方式实现父类的功能(方法重写)。

class Animal                              //父类
{
    protected string name = "";          //字段,修饰符意味子类可以继承
    public Animal(string name)           //构造函数
    {
        this.name = name;
    }

    protected int shoutNum = 3;         //属性及其设置方法

    public int ShoutNum
    {
        get
        {
            return shoutNum;
        }
        set
        {
            shoutNum = value;
        }
    }

    public virtual string Shout()         //父类方法,注意增加的虚拟修饰符代表该方法允许被子类重写
    {
        return "";
    }
}

 

class Cat : Animal                                        //子类,继承自父类
{
    public Cat(string name) : base(name)                 //继承父类的构造函数,构造函数不能被继承,只能被调用
    { }

    public override string Shout()                       //重写父类的方法
    {
        string result = "";
        for (int i = 0; i < shoutNum; i++)
            result += "";

        return "我的名字叫" + name + " " + result;
    }
}

 

继承的优点:代码共享,避免重复,可使得修改或扩展继承而来的实现都较为容易;

继承的缺点:父类变子类变,继承会破坏包装,父类实现细节暴露给子类,显然是一种类与类之间强耦合的关系。

总结:继承适用情况是两个类具备‘is-a’的关系时,即完全包含。

 

三、多态

多态表示不同的对象可以执行相同的动作,但要通过自己的实现代码来执行,第二节中的父类和子类的重写方法即是多态的表示。

virtual关键字可以使用的范围:属性、事件、方法和索引器,但是字段不能虚拟。子类可以选择使用override关键字重写父类的方法。

private void button1_Click(object sender, EventArgs e)                //客户端调用
        {
            Animal cat ;                                              //声明时要声明父类
            cat =  new Cat("小咪");                                     //实例要实例为子类
            cat.ShoutNum = 5;                                          //执行子类重写后的方法
            MessageBox.Show(cat.Shout());
        }

 

四、衍生:重构

重构都是在程序编写过程中发现大量重复代码,因而对现有代码进行重新编写,提取重复部分融入或新建父类的。在父类中需要子类完全继承的方法不要添加virtual关键字,使其成为普通方法,而需要子类自行定义的方法定义成虚方法。