閱讀403 返回首頁    go 阿裏雲 go 技術社區[雲棲]


設計模式之麵向對象基礎

        最近看設計模式,這本書我特別喜歡,內容也很好理解,讀起來有些上癮,哈哈,一開始看了看麵向對象基礎,之前接觸過麵對對象基礎,對麵向對象三大特性有了進一步的理解,下麵做個總結:

                1、封裝

                      概念:每個對象都包含它能進行操作所需要的所有信息,這個特性稱為封裝。

                      理解:就像一個大盒子,它具有某類事物的共同特性,我需要做的就是將這些共性實例化為個例,比如Cat類實例化為名為Tom的一隻貓。

                      優點:1、減少耦合,即可以減少對外界的依賴和聯係,盡可能獨立;2、類內部的實現可以自由地修改,但會減少對外界的影響;3、類具有清晰的對外接口;

      例子:這裏的兩個類是互不影響的,它們互不依賴。

                      

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 封裝
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Cat cat = new Cat("dandan");
            cat.ShoutNum = 5;
            MessageBox.Show(cat.Shout());
        }
        class Cat
        {
            private string name = "";
            public Cat (string name)
            {
                this.name = name;
            }
            public Cat()
            {
                this.name = "丹丹";
            }
            public string Shout()
            {
                string result = "";
                for (int i = 0; i < shoutNum;i++ )
                {
                    result += "喵";
                }
                return "我的名字叫" + name + "喵";
            }
            public int shoutNum = 3;
            public int ShoutNum
            {
                get
                {
                    return shoutNum;
                }
                set
                {
                    if (value <= 10)
                        shoutNum = value;
                    else
                        shoutNum = 10;
                }
            }
        }
        private void button2_Click_1(object sender, EventArgs e)
        {
            Dog dog = new Dog("dandan");
            dog.ShoutNum = 5;
            MessageBox.Show(dog.Shout());
        }
         class Dog
         {
             private string name = "";
             public Dog(string name)
             {
                 this.name = name;
             }
             public Dog()
             {
                 this.name = "丹丹";
             }
             public string Shout()
             {
                 string result = "";
                 for (int i = 0; i < shoutNum; i++)
                 {
                     result += "汪";
                 }
                 return "我的名字叫" + name + "汪";
             }
             public int shoutNum = 3;
             public int ShoutNum
             {
                 get
                 {
                     return shoutNum;
                 }
                 set
                 {
                     if (value <= 10)
                         shoutNum = value;
                     else
                         shoutNum = 10;
                 }
             }
         }

      
    }
}


                2、繼承

                           概念:對象的繼承代表了一種‘is-a’的關係,如果兩個對象A和B,可以描述為‘B是A’,則表明B可以繼承A。

                          理解:比如鋼筆是文具,則鋼筆繼承了文具,但是鋼筆除了具有文具的特征外還有他的特性,比如需要用鋼筆水,筆尖是鋼製的。再比如兒子和父親,兒子具有父親的一些外貌的特征,但是兒子本身身高要高,大眼睛,這些就是新的特性,父親在麵向對象中也叫父類或基類,而兒子則叫子類或派生類。

                          優點:使得所有子類公共的部分都放在了父類,使得代碼得到了共享,這就避免了重複,並且,繼承可使得修改或擴展而來的實現都較為容易。

                          注意:1、子類擁有父類非private的屬性和功能(即擁有public和protected);2、子類具有自己的屬性和功能,即子類可以擴展父類沒有的屬性和功能;3、子類可以以自己的方法實現父類的功能(方法重寫)。

                           例子:我想大家都看到上麵的例子有大量的重複代碼,這樣不但增加代碼量,而且很容易出錯,所以我們就用到了繼承,將它們共同的部分提取出來稱為父類,讓Cat和Dog都去繼承。下麵是改進後的代碼,對比一下就能體會出繼承的作用了。

                           

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 繼承
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        class 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;
                }
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Cat cat = new Cat("dandan");
            cat.ShoutNum = 5;
            MessageBox.Show(cat.Shout());
        }
        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 ;
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Dog dog = new Dog("dandan");
            dog.ShoutNum = 5;
            MessageBox.Show(dog.Shout());
        }
        class Dog : Animal
        {
            public Dog()
                : base()
            { }
            public Dog(string name)
                : base(name)
            { }
            public string Shout()
            {
                string result = "";
                for (int i = 0; i < shoutNum; i++)

                    result += "汪";

                return "我的名字叫" + name + " " + result;
            }
        }
    }
}
                  3、多態

                           概念:不同的對象可以執行相同的動作,但要通過它們自己的代碼實現。

                           理解:比如說我們代碼中舉得例子,貓狗都有叫,但是叫的聲音不同,那麼我們就可以寫一個叫的方法,這個方法為父類,但是父類是不能直接去實現貓狗的叫聲的,所以需要將父類虛化即用virtual,然後子類去重寫這個方法即用override。

                          例子:在這個例子中因為運用到了多態,所以在運行結果中就會出現在動物報名完成後,叫聲比賽中每個動物會自動與其相對應的叫聲結合,即將Shout()方法重寫,得到正確的叫聲。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 多態
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        class 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 "";
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Cat cat = new Cat("dandan");
            cat.ShoutNum = 5;
            MessageBox.Show(cat.Shout());
        }
        class Cat : Animal
        {
            public Cat()
                : base()
            { }
            public Cat(string name)
                : base(name)
            { }
            public override string Shout()
            {
                string result = "";
                for (int i = 0; i < shoutNum; i++)
                
                    result += "喵";
                
                return "我的名字叫" + name + " " + result;
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Dog dog = new Dog("dandan");
            dog.ShoutNum = 5;
            MessageBox.Show(dog.Shout());
        }
        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;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private Animal[] arrayAnimal;//動物數組
        //動物報名
        private void button3_Click(object sender, EventArgs e)
        {
            arrayAnimal = new Animal[2];
            arrayAnimal[0] = new Cat("小花");
            arrayAnimal [1]=new Dog ("丹丹")
            
        }

        private void button4_Click(object sender, EventArgs e)
        {
            foreach (Animal item in arrayAnimal )//遍曆數組,讓貓狗都Shout()
            {
                MessageBox.Show(item.Shout());
            }
        }
    
    }
}
             對這三大特性的理解還有待實踐提高,希望大家給予指導!


最後更新:2017-04-03 12:55:01

  上一篇:go 內存子係統1_分配接口
  下一篇:go Android 開發 NDK從入門到精通