要开始大话设计模式的学习了,看这本书的封面,感觉很轻松,很卡通,很有趣。一本新书怎么去读,怎么去学,老师讲过很多次了。
一本书的前言是相当重要,它能帮助我们掌握全局,它也可能会给予我们一些指导。读完前言,我便知道自己下一步该做什么了。
下一个脚步——面向对象再理解。
关于面向对象,在学习C#的时候有了初步总结,但感觉很多概念理解得都不是很深刻。所以,在学习设计模式之初,很有必要再次进行总结。
从设计模式这本书中,故事性、提问性、交谈性的编写方式,读起来的感觉真的不太一样,没有那么枯燥,硬邦邦的感觉。
什么是对象?什么是类?就从动物运动会这个故事的开端说起了。
怎么才能实现猫叫?这个问题对于我们来说很容易啊,只要在点击按钮的事件下添加一行代码就可以了,
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">private void button1_Click(object sender, EventArgs e) { MessageBox .Show ("喵"); } </span></span>但这样做,很多问题就出现了。如果在其他事件下也需要实现猫叫,怎么办呢?这就引出了“类”,有了类,我们可以随时随地调用它。
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">class Cat//定义猫类 { public string Shout()//类的方法 { return "喵"; }</span></span>我们该怎么去应用类呢?答案是将类实例化,这就引出了“对象”。接下来一个实例就是声明一个cat对象,让其实现猫叫。
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">private void button1_Click(object sender, EventArgs e) { Cat cat = new Cat();//类实例化 MessageBox.Show(cat.Shout()); }</span></span>什么是构造函数?什么是方法重载?我们的故事才刚刚开始。
人出生了,爸妈都会想着给孩子起个名字。动物也一样,特别是家里养得宠物,都有个可爱又洋气的名字。那么这就要用到构造函数了,即对类初始化。
所有的类都有构造方法,且与类同名,如果不定义构造方法,系统会默认生成空的构造方法。我们要给猫起个名字,就需要自己写一个构造方法。
<span style="font-size:24px;"><pre name="code" class="csharp"><span style="font-family:KaiTi_GB2312;font-size:18px;">class Cat//定义猫类 { private string name = "";//声明Cat类的私有字符串变量name public Cat(string name)//定义Cat类的构造方法,参数为输入一个字符串 { this.name = name; } public string Shout()//类的方法 { return "我的名字叫" + name + " 喵"; } }</span></span>
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">private void button1_Click(object sender, EventArgs e) { Cat cat = new Cat("咪咪"); MessageBox.Show(cat.Shout()); }</span></span>这样我们就可以实现给猫起个名字叫“咪咪”。另外,一个类中构造函数的个数是可以多个的,可以根据需要删减,比如:我们也可以添加猫的出生日期等等。
但有时候,名字一开始还没有确定,这样不给出一个名字,就会出错了。这里我们就可以用重载的方法解决。同一个方法名,但参数类型不一样。这也验证了我的上一个说法,构造函数可以多个,下面,为了避免错误的法伤,我们又添加了一个构造函数:
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">class Cat//定义猫类 { private string name = "";//声明Cat类的私有字符串变量name public Cat(string name)//定义Cat类的构造方法,参数为输入一个字符串 { this.name = name; } public Cat()//构造函数重载 { this.name="无名"; } public string Shout()//类的方法 { return "我的名字叫" + name + " 喵"; } }</span></span>
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"> private int shoutNum = 3;//声明默认叫的次数为3 public int ShoutNum { get { return shoutNum;//读属性 } set { shoutNum = value;//写属性 } }</span></span>
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"> public string Shout()//类的方法 { string result = ""; for (int i = 0; i < shoutNum; i++) { result += "喵 "; } return "我的名字叫:" + name + "喵 " + result; }</span></span>
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">private void button1_Click(object sender, EventArgs e) { Cat cat = new Cat("小咪");//实例化一个小咪对象 cat.ShoutNum = 5;//给属性赋值 MessageBox .Show (cat.Shout()); }</span></span>
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">class Animal//定义动物类 { protected string name = ""; protected Animal(string name) { this.name = name; } public Animal () { this.name = "无名"; } protected int shoutNum = 3; public int ShoutNum { get { return shoutNum; } set { shoutNum = value; } } }</span></span>
<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">class Cat : Animal { public Cat() : base() { } public Cat(string name):base(name) {} public string Shout() { string result = ""; for (int i = 0; i < shoutNum; i++) result += "喵, "; return "我的名字叫" + name + " " + result; } }</span></span>
<span style="font-size:24px;">public string Shout() { string result = ""; for (int i=0;i<shoutNum ;i++) result +=getShoutSound()+ ", "; return "我的名字叫" + name + " "+result ; }</span>
<span style="font-size:24px;">class Sheep : Animal { public Sheep() : base() { } public Sheep(string name) : base(name) { } protected override string getShoutSound() { return "咩"; } }</span>
<span style="font-size:24px;">class Dog : Animal { public Dog() : base() { } public Dog(string name) : base(name) { } protected override string getShoutSound() { return "汪"; } }</span>
<span style="font-size:24px;">interface IChange { string ChangeThing(string thing); }</span>
<span style="font-size:24px;">class MachineCat : Cat, IChange { public MachineCat() : base() { } public MachineCat(string name) : base(name) { } public string changeThing(string thing) { return base.Shout() + " 我有万能的口袋,我可变出: " + thing; } }</span>