將大話設計模式作筆記
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);
}
}
}