设计模式前传——面向对象基础(C#语言)

来源:互联网 发布:服装销售英文软件 编辑:程序博客网 时间:2024/06/07 14:59

    ——最简单开始:从猫叫说起

    首先实现功能

    单击窗体中的“猫叫”按钮弹出“喵”叫声。

    功能完善:

    1.需要记录猫的名称并要求多叫几声,并能够从其他窗体调用——抽象Cat类:实现记录姓名及叫声甚至叫声次数,达到良好封装

 

     2.狗也来参加叫声比赛,现需实现以上功能,可继续抽象得出类Dog。

     

     3.观察发现:Cat与Dog类中代码大部分相似,则可继续抽象得出父类,动物Animal类。通过子类Cat、Dog继承父类属性和功能减少代码重复,方便修改功能,增强扩展性。

     4.动物叫声各有不同,加之需要参加比赛的猫、狗类数目增多,但其中代码大部分相同,能否继续缩减相同代码但须保证动物叫声个异性。——构造父类虚方法和子类方法重写完成动物叫声多态性。

     由于数目增多但其定义数组功能必须限定个数,则在此引入集合概念已解决此问题,但由于早期C#中集合设计拆箱、装箱过程耗费大量系统资源,则之后引出泛型概念,但泛型不仅仅包括集合类。

     5.重构可发现去掉虚方法部分可实现继续缩减重复代码。

     6.动物运动会中除去叫声比赛外另增加特异功能展示:参演者包括机器猫叮当以及孙悟空,他们都将实现“变出东西”的特异功能,但具体方式不同(机器猫通过肚皮口袋变出,孙悟空拔根毫毛变出),其父类又不具其功能,此时即可通过接口实现。

     过程描述图:

    

     最终代码实现(注释部分为逐步修改过程):

namespace 面向对象基础{    public partial class Form1 : Form    {        IList<Animal> arrayAnimal;        //private Animal[] arrayAnimal;        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            //MessageBox.Show("喵");            //Cat cat = new Cat();            //MessageBox.Show(cat.Shout());            Cat cat = new Cat("咪咪");            cat.ShoutNum = 5;            MessageBox.Show(cat.Shout());                    }        private void button2_Click_1(object sender, EventArgs e)        {            Dog dog = new Dog();            MessageBox.Show(dog.Shout());        }        private void button3_Click(object sender, EventArgs e)        {            arrayAnimal = new List<Animal>();            arrayAnimal.Add(new Cat("花花"));            arrayAnimal.Add(new Dog("阿毛"));            arrayAnimal.Add(new Dog("旺财"));            arrayAnimal.Add(new Cat("娇娇"));            arrayAnimal.Add(new Cat("咪咪"));            MessageBox.Show(arrayAnimal .Count .ToString ());            //arrayAnimal[0] = new Cat("花花");            //arrayAnimal[1] = new Dog("阿毛");            //arrayAnimal[2] = new Dog("旺财");            //arrayAnimal[3] = new Cat("娇娇");            //arrayAnimal[4] = new Cat("咪咪");        }        private void button4_Click(object sender, EventArgs e)        {            foreach (Animal item in arrayAnimal)            {                MessageBox.Show(item.Shout());            }        }        private void button5_Click(object sender, EventArgs e)        {            MachineCat mcat = new MachineCat("机器猫");            SunWuKong wukong = new SunWuKong("孙悟空");            IChange[] arrary = new IChange[2];            arrary[0] = mcat;            arrary[1] = wukong;            MessageBox.Show(arrary[0].ChangeThing("各种各样的东西!"));            MessageBox.Show(arrary[1].ChangeThing ("各种各样的东西!"));        }    }}#region 猫//class Cat//{//    //public string Shout()//    //{//    //    //return "喵";//    //}//    private string  name = "";//    private int shoutNum = 3;//    public int ShoutNum//    {//        get//        {//            return shoutNum;//        }//        set//        {//            if (value <= 10)//                shoutNum = value;//            else//                shoutNum = 10;//        }    //    }//    public Cat(string name)//    {//      this.name = name;//    }//    public Cat()//    {//        this.name = "无名";//    }//    public string shout()//    {//        //return "我的名字叫" + name + " 喵";//        string result = "";//        for (int i = 0; i < shoutNum; i++)//        {//            result += "喵 ";//        }//        return "我的名字叫" + name + " " + result;//    }//}#endregion#region 狗//class Dog//{//    private string name = "";//    private int shoutNum = 3;//    public Dog(string name)//    {//        this.name = name;//    }//    public Dog()//    {//        this.name = "无名";//    }//    public int ShoutNum //    {//        get//        {//            return shoutNum;//        }//        set//        {//            if (shoutNum <= 10)//                shoutNum = value;//            else//                shoutNum = 10;//        }//    }//public string Shout()//    {//        string result = "";//        for (int i = 0; i < shoutNum; i++)//        {//            result += " 汪";//        }//        return "我的名字叫" + name + result;//    }//}#endregionclass Animal{    protected string name;    public Animal(string name)    {        this.name = name;     }    public Animal()    {        this.name = "无名";    }    protected int shoutNum=3;    public int ShoutNum    {    get    {        return shoutNum ;    }    set    {        shoutNum = value;    }    }    //public virtual string Shout()    //{    //    return "";    //}    public string Shout()    {        string result = "";        for (int i=0;i <shoutNum;i++)            result +=getShoutSound()+", ";        return "我的名字叫" + name + " " + result ;    }    protected virtual string getShoutSound()    {        return "";    }}class Cat:Animal {    public Cat(string name)        : base(name)    { }    public Cat()        : base()    { }    //public override string Shout()    //{    //    string result="";    //    for (int i=0; i < shoutNum; i++)    //        result += " 喵";    //    return "我的名字叫" + name + result;    //}    protected override string getShoutSound()    {        return "喵";    }}class MachineCat : Cat, IChange{    public MachineCat()        : base()    {     }    public MachineCat(string name)        : base(name)    {     }    public string ChangeThing(string Thing)    {        return base.Shout() + "我有万能的口袋,我可变出:" + Thing;    }}class SunWuKong : Monkey, IChange{    public SunWuKong()        : base()    {    }    public SunWuKong(string name)        : base(name )    {     }    public string ChangeThing(string Thing)    {        return base.Shout() + "我会七十二变,我可变出:" + Thing ;    }}class Dog : Animal{    public Dog() : base()    {}    public Dog(string name) : base(name)    {}    //public override string Shout()    //{    //    string result="";    //    for (int i = 0; i < shoutNum; i++)    //        result += " 汪";    //    return "我的名字叫" + name + result;    //}    protected override string getShoutSound()    {        return "汪";    }}class Monkey : Animal{    public Monkey()        : base()    {    }    public Monkey(string name)        : base(name)    {    }    protected override string getShoutSound()    {        return "吱";    }}interface IChange{    string ChangeThing(string Tings);}

    面向对象基础与C#基础部分知识整理如下图:

        面向对象的理解还停留在肤浅的阶段,相信随着学习以及应用逐步深刻。

 

作者更多信息 

原创粉丝点击