2013年10月19日 星期六

物件導向OOL basic

將大話設計模式作筆記

1.類別是具有相同屬性和功能的抽象集合。

2.實体,就是真實的物件。而實体化就是建立物件的過程。

3.方法重載-提供了建立同名的多個方法的能力,但這些方法需使用不同的參數類型。

   可在不改變原方法的基礎上,新增功能。

4.屬性與修飾子- 屬性是一個方法或一對方法,但在調用它的程式碼看來,它是一個欄位,即屬性適合於以欄位的方法使用方法調用的場合。;屬性有二個方法 get 和 set。 get存取器返回與宣告的屬性相同的資料類型,表示的意思是調用時可以得到內部欄位的值或參考:set存取器沒有顯式設定參數,為穩式參數value,它的作用是調用屬性時,可以給內部欄位。

欄位-是類別相關的變數。

5.封裝-物件特性(封裝' 繼承及多型) 。每個物件都包含它進行操作所需要的所有資訊,這個特性稱為封裝,因此物件不必依賴其它物件來完成操作。

A.良好的封裝可減少耦合。

B.類別內容的實現可以自由地修改.

C.類別有清晰的對外介面。

5.繼承-物件繼承是代表一種"is -a"的關係,如果二個物件A和B,可以描述為"B是A",則表明B可以繼承A。

  繼承者可理解為被繼承者的特殊化,因為它除了具備被繼承者的特性外,還具備自己的特性。

  A.子類別別擁有父類別非private的屬性和功能。

  B.子類別具有自己的屬性及功能,即子類別可以擴展父類別沒有的屬性和功能。

  C.子類別還可以用自己的方式實現父類別的功能(方法重寫)。

  D.在C#中,子類別可從父類別中繼承的成員有方法, 欄位, 屬性,事件,索引。 但對建構式,是不能被繼承的。而若要調用父類別的成員,可用 base(ex, base(element))

  E.缺點: 繼承會破壞包裝,增強了類別間的耦合性。故只有在二個有"is a"下才可使用。

6.多型:

  表示不同的物件可以執行相同的動作,但要透過它們自己的實現的程式碼來執行。

  A.子類別是以父類別的身份出場。

  B.子類別在工作時以自己方式來實現

  C.子類別以父類別出現(宣告時),子類別的特有的屬性及方法不可使用。

  D.虛擬方法和方法重寫: 為了使子類別的實体完全地接替來自父類別的類別成員,父類別必須將成員宣告成虛擬的。這是在讓成員的返回類型之前加上virtual。 而虛擬化,除了欄位不可以外其它均可的。也可以在虛擬成員中加入 而虛擬化,除了欄位不可以外其它均可的。也可以在虛擬成員中加入實体(實際的內容): 而方法重寫則是以override 來把父類別中的替換成自己的。

7.抽象類別:

  把實体化沒有意義的父類別,改成抽象abstract化(也可將方法抽象)。

  A.抽象類別不能實体化。

  B.抽象方法必須被子類別重寫。

  C.若類別中"有任一方法"是抽象則其類別也必為抽象。

  抽象方法和虛擬方法,?(擁有盡可能多的共同程式碼; 也擁有盡可能少的資料)

  D.抽象類別代表了一個抽象楖念,它提供了一個繼承的出發點,當設計成抽象時,一定是用在被繼承。

     樹技和樹葉.

8.介面:

   讓三個特殊類別具有特別的方法.

   把穩式公共方法和屬性組合起來,以封裝特別功能的一個集合。一旦類別實現了介面,類別就可以支援介面所指定的所有屬性和成員。宣告介面在語法上和抽象類別相同,但不允許提供介面中任何成員的執行方式(也不能實体化,建構式和欄位)。

在繼承介面的類別中,必須去實作其介面interface中的所有方法及屬性(get ,set)

  介面和抽象:

  A.一個類別可繼承多個介面,但只能一個抽象。

  B.抽象是可以給出一些成員的實現,介面卻不包含成員的實現,抽象類別中"抽象成員"才可被子類別部份實現。介面則需繼承的類中完全實現。

  C.抽象類別是對物件抽象; 介面則是對行為抽象。

  D.對不同類別的物件,可使用介面; 同一類似的則用抽象.

9.集合和泛型:

   集合, .Net Framework提供了用於資料儲存和檢索引的專用類別。提共了堆疊,佇列及雜湊表的支持。 且有相同的介面。

   ArrayList。不會去檢查其加入的類別型態,且在包/解 包裝,需大量資源。所以才有泛型

 

10.委託與事件: 

   委託是對函數的封裝,可以當作給方法的特徵指定一個名稱。 而事件則是委託的一種特殊的形式, 當有發生有意義的事情時,事件物件處理通知過程。

委託是一種參考方法的類型。一旦為委託分配了方法,委託將與該方法有完全相同的行為。委託物件利用delegate來宣告,而事件是說在發生其它類別或物件關注的事情時,類別可以透過事件通知。

using System;
using System.Collections.Generic;
using System.Text;
 
namespace 動物練習
{
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("Tom");
            Mouse mouse1 = new Mouse("Jerry");
            Mouse mouse2 = new Mouse("Jack");
            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
            cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
 
            cat.Shout();
 
            Console.Read();
        }
    }
 
    //無參數委託事件
    //class Cat
    //{
    //    private string name;
    //    public Cat(string name)
    //    {
    //        this.name = name;
    //    }
 
    //    public delegate void CatShoutEventHandler();
    //    public event CatShoutEventHandler CatShout;
 
    //    public void Shout()
    //    {
    //        Console.WriteLine("喵,我是{0}.", name);
 
    //        if (CatShout != null)
    //        {
    //            CatShout();
    //        }
    //    }
    //}
 
    //class Mouse
    //{
    //    private string name;
    //    public Mouse(string name)
    //    {
    //        this.name = name;
    //    }
 
    //    public void Run()
    //    {
    //        Console.WriteLine("老貓來了,{0}快跑!", name);
    //    }
    //}
 
    //有參數委託事件
    class Cat
    {
        private string name;
        public Cat(string name)
        {
            this.name = name;
        }
 
        public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs args);
        public event CatShoutEventHandler CatShout;
 
        public void Shout()
        {
            Console.WriteLine("喵,我是{0}.", name);
 
            if (CatShout != null)
            {
                CatShoutEventArgs e = new CatShoutEventArgs();
                e.Name = this.name;
                CatShout(this, e);
            }
        }
    }
 
    public class CatShoutEventArgs : EventArgs
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
 
    class Mouse
    {
        private string name;
        public Mouse(string name)
        {
            this.name = name;
        }
 
        public void Run(object sender, CatShoutEventArgs args)
        {
            Console.WriteLine("老貓{0}來了,{1}快跑!", args.Name, name);
        }
    }
}

沒有留言:

張貼留言