本內容參考大話設計模式記錄
對象:一切事物皆對象。類:對對象進行的抽象。執行個體:類的一個具體實體。
方法重載:方法名相同但是參數類型或者個數不同的方法。
物件導向的三大特性:繼承,封裝,多態
繼承:子類繼承父類後具有父類的保護和公有的一些方法,屬性等並且能擴充自己。對於父類的建構函式只能調用不能繼承。當對象與對象的關係是is-a時候用繼承,當關係式has-a我們應該用組合或者彙總(橋接模式)。
封裝:一個類在其內部擁有自己的方法,欄位完成一些操作而不需要其他類,內部變化對於外面是不清楚的,只是提供一個介面。
多態:子代父完成一些操作(用到Virtual和Override),也就是依賴倒置原則的核心。(也就是調用的父類的方法,但是執行的是子類的函數實體),但是有個缺點就是,子類的擴充不能使用。
重構:對現有代碼最佳化,把重複出現的部分抽取出來。(模板方法模式,提取抽象類別等方法)
抽象類別:對類的抽象。(類是對對象的抽象,介面是對方法的抽象,代理也是對方法的抽象),當我們發現我們建立的類不需要去執行個體化的時候我們可以把它設計為抽象類別,注意的是抽象類別必須被子類重寫的,抽象類別儘可能的擁有多的共同代碼,盡量少的資料。
介面:把一些特定的方法或者屬性進行抽象。
介面和抽象類別的區別:一個類可以繼承多個介面,但只能繼承一個抽象類別。抽象類別可以給出一些成員的實現,而介面不能。抽象類別的抽象成員可以被子類部分實現,而介面需要完全實現。抽象類別是對對象的整體抽象,介面是對對象的局部抽象(方法和屬性)。對於行為跨越不同的類對象的時候我們應該用介面,對於一些相似的對象我們用抽象類別。從設計的角度分析,抽象類別是從子類中發現公用的部分,泛化出父類,然後子類繼承父類。而介面是根本就不知道子類的存在,方法如何?還不確定,預先定義。(抽象是自底而上,介面是自頂而下)。
集合:數組(分配空間固定,易於讀取,不利於更改)。ArrayList易於更改,可以添加不同類型的資料(導致它是不安全類型),但是對於資料的操作的時候大量用到了裝箱和拆箱的操作,佔用了大量的空間和時間。注意:它的一個操作將帶動所有的其他成員發生變化。比如我們要連續刪除前2個成員要用:ArrayList.Remove(0);ArrayList.Remove(0);而不是ArrayList.Remove(0);ArrayList.Remove(1);
泛型:為瞭解決ArrayList的裝箱和拆箱帶來效能上的問題。(我覺得泛型就是通過參數預先給不同的資料先制定需要儲存一個單位的空間),用IList<T> Lists=new List<T>解決。它的好處在於解決了型別安全和裝箱拆箱操作。
事件與委託:委託是函數的封裝或者說是函數的另外一種表現形式。而事件則是委託的一種特殊形式,委託是一種引用方法的類型,一旦委託分類方法成功,那麼委託和方法具有相同的行為。而事件是說在發生其它類或對象關注的事情時,類或對象可以通過事件通知他們。
下面代碼展示怎樣在類中建立委託,事件,並且在執行個體後怎樣給事件賦值(事件的觸發是類內部觸發的,外部只需要給事件賦值就行了,一般在內部觸發先要判斷事件是否為空白,然後調用)
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);
}
}
帶參數的事件
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(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);
}
}
}