C#——方法實現總結
本文分兩部分來寫,第一部分:C#方法實現的理解與問題,第二部分:C#中方法實現的種類。
第一部分:C#方法實現的理解與問題
理解:
1. 使用virtual和override關鍵字,在基類和衍生類別中用同樣的方法簽名實現不同的方法
2. 使用interface介面,在不同的類中,用相同的方法簽名實現不同的方法
3. 用委託delegate,把不同類中的方法集合在一起,然後一起調用,完成某種綜合的功能
4. 使用事件,完成跟委託一樣的功能
以上四條全都說明了物件導向的多態性。
問題:
怎麼樣區分委託和事件?
我把它們給混淆了,分不清楚。
第二部分:C#中方法的實現分為以下幾種:
1.最基本的方法聲明
returnType methodName (parameterList)
{
//方法主體
}
2.聲明new方法
假如基類和衍生類別中聲明了兩個具有相同簽名的方法,那麼在編譯的時候會出現一條警告資訊(衍生類別的方法會屏蔽基類中的方法)
如果在衍生類別中使用new關鍵字來聲明與基類有著相同簽名的方法,編譯時間不會出現警告資訊,衍生類別的方法依然會屏蔽基類中的方法,只是編譯時間不出現警告資訊
Example:
Class Horse:Mammal
{
New public void Talk()
{
//方法主體
}
}
3.聲明virtual方法
聲明virtual方法的目的:提供同一個方法的不同實現,而這些方法是相互關聯的,因為他們旨在完成相同的任務,只是不同的類(不同的類只能時衍生類別)會有不同的實現。
用virtual關鍵字把方法聲明為virtual
Example:
namespace System
{
Class Object
{
Public virtual string ToString()
{
//方法主
}
4.聲明override方法
假如基類將一個方法聲明為virtual方法,衍生類別就可以用override關鍵字來聲明該方法的另一個實現。
Example:
Class Horse:Mammal
{
Public override string ToString()
{
}
}
在衍生類別中一個方法的新的實現可以調用方法在基類中的原始實現,這要用base關鍵字來實現。
Example:
Public override string ToString()
{
base.ToString();
}
注意:
使用virtual和override關鍵字聲明多態方法遵守的規則如下:
A.不允許用virtual和override聲明一個private方法,否則出現編譯錯誤
B.兩個方法的的簽名必須完全一致,傳回型別也必須相同。也就是說他們必須有相同的名稱,相同的參數類型,相同的參數數量,以及相同的傳回型別。
C.兩個方法必須有相同的可訪問性。例如其中一個方法是public,那麼另一個必須是public的(方法也可以是protect)
D.只能是override重寫virtual方法,如果基類方法不是virtual,你試圖用override重寫它,會出現編譯錯誤
E.假如衍生類別不用override來聲明方法,就不會重寫基類方法,它會成為和基類方法完全不相關的另一個方法的實現,該方法只是恰巧與基類方法同名,這樣會造成編譯時間發出警告:該方法會隱藏繼承的同名方法。可以用new關鍵字消除這一警告。
F.一個override的方法會隱式的成為virtual方法,本身可在未來的衍生類別中被override,不允許用virtual顯式的聲明override方法
5.擴充方法
擴充方法是在一個靜態類中定義的,要擴充的類型必須是方法的第一個參數,而且必須附加一個this關鍵字。
擴充方法允許通過附加的靜態方法來擴充現有的類型(無論類還是結構),任何語句一旦引用被擴充類型的資料,就能立即使用這些靜態方法。
Example:
Static class Util
{
Public static int Negate(this int i)
{
return –i;
}
}
要使用擴充方法,只需要讓Util類進入範圍(如有必要,添加using語句,指定Util類所在的命名空間),然後可以簡單的使用“.”記號法來引用方法。
Example:
Int x=591;
Console.writeline(“x.Negate{0}”,Util.Negate(x));
6.Interface 介面
介面名字以大寫字母I開頭,同樣的方法名字,在不同的類(這個不同的類不是指的衍生類別)中有不同的實現方法。
介面只包含方法的名稱、傳回型別和參數,方法具體的實現介面並不關心。
(我的理解:介面只是聲明方法,不實現方法)
介面中不允許指定任何存取修飾詞(不能限制public 、private、protected)
Example:
Interface IComparable
{
Int compareTo(object obj)
}
要實現一個介面,需要聲明一個類或結構,讓他們從介面繼承,並實現介面指定的所有方法。
注意:
實現一個介面必須保證:每個方法都完全符合與它對應的介面中的方法
A方法名和傳回型別完全符合
B所有參數完全符合(包括ref和out關鍵字修飾符)
C使用介面名作為方法名的首碼,這稱為明確介面實作,我們平時應多使用明確介面實作
D用於實現一個介面的所有方法都必須具有public可訪問性,假如使用明確介面實作,則不應該為方法添加存取修飾詞
7.委託(delegate)
委託是指向一個方法的指標,通過指定一個委託名稱,就可以通過委託來調用不同類中的方法。
委託用法:
A 委託在類中聲明,
B 建立委託執行個體,
C 在類的構造器中為委託執行個體添加其他類的方法
D 在類中編寫方法調用委託執行個體
注意:
在命名空間聲明的委託不需要在構造其中添加方法,不需要在類中寫方法調用委託,可以直接調用委託
使用委託的時候,遇到帶參數的方法,有兩種處理方法:
A:創造方法適配器實現委託
B:利用lambda運算式實現委託
8.事件
事件是在委託的基礎上進行聲明的。
具體做法:
A:首先在類中聲明委託;
B:利用聲明的委託聲明事件
C:訂閱事件(為事件添加方法)
D:引發事件(跟委託相似,把一個事件當方法調用)
注意:
事件只能由定義它的類來引發,在類外部引發事件會造成編譯錯誤
lambda運算式同樣適用於事件