设计模式前传——面向对象基础(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#基础部分知识整理如下图:
面向对象的理解还停留在肤浅的阶段,相信随着学习以及应用逐步深刻。
作者更多信息
- 设计模式前传——面向对象基础(C#语言)
- 黑马程序员——Java语言基础:面向对象、封装(构造函数、设计模式)
- 设计模式——面向对象基础
- 【设计模式】——面向对象基础
- 设计模式——C语言的面向对象
- C#面向对象设计模式纵横谈——笔记(1)
- C#面向对象设计模式纵横谈——笔记(2)
- C#面向对象设计模式纵横谈——笔记(3)
- C#面向对象设计模式纵横谈——笔记(4)
- C#面向对象设计模式
- 大话设计模式学习心得——面向对象基础
- 大话设计模式——面向对象基础初理解
- 设计模式第一天——面向对象的基础
- 设计模式:面向对象基础
- 【设计模式】面向对象基础
- 面向对象设计模式基础
- 设计模式前篇——常见的面向对象设计原则
- 设计模式基础——面向对象设计原则(一)
- PyQt 国际化支持
- C++编码规范
- 回调函数例子
- 文件打开关联
- java分栏显示
- 设计模式前传——面向对象基础(C#语言)
- C++错误“exit was not declared in this scope”
- QTP参数化Global和Local的区别
- 舒迅:产品经理必读的九步法
- Keil MDK入门---从新建一个工程开始
- 计算机网络基础——物理层
- 《Windows Forms编程实战》.(Erik Brown)(奋斗的小鸟)_PDF 电子书
- linux 挂载IOS文件 挂载光盘
- IIS6.0安全设置