第十三章、创建接口和定义抽象类
接口不包含任何代碼或數據:它只規定了從接口繼承的類必須提供哪些方法和屬性。使用接口,方法的名稱/簽名可以和方法的具體實現完全隔絕。
抽象類在許多方面都和接口相似,只是它們可以包含代碼和數據。然而,可以將抽象類的某些方法指定為虛方法,指示從抽象類繼承的類必須以自己的方式實現這些方法。
理解接口
接口指定“有什么”,也就是方法的名稱、返回類型和參數。至于具體“如何做”。或者說方法具體如何實現,則不是接口所關心的。接口描述了類提供的功能,但不描述功能如何實現。
定義接口
定義接口類似于定義類,只是要用interface關鍵字而不是class關鍵字。在接口中,要按照與類或結構中一樣的方式聲明方法,只是不允許指定任何訪問類型。另外,接口中的方法是沒有實現的,它們只是聲明。實現接口的所有類型都必須提供自己的實現。所有,方法主體被替換成一個分號。如:
interface IComparable{
int CompareTo(Object obj);
}
Microsoft.NET Framework 文檔建議接口名以大寫字母I開頭。
接口不包含任何數據:不可以向接口添加字段(私有的也不行)。
實現接口
為了實現接口,需要聲明類或結構從接口繼承,并實現接口指定的全部方法。雖然不能從一個結構派生出另一個結構,但結構是可以實現接口的(從接口“繼承”)。
interface ILandBound
{
int NumberLegs();
}
calss Horse:?ILandBound
{
..........
public int NumberLegs() ? //隱式實現接口
{
return 4;
}
}
實現接口時,必須保證每個方法都完全匹配對應的接口方法,具體遵循以下幾個規則:
①方法名和返回類型完全匹配
②所有參數(包括ref和out關鍵字修飾符)都完全匹配
③用于實現接口的所有方法都必須具有public可訪問性。但是,如果使用顯示接口實現,則不應該為方法添加訪問修飾符。
一個類可以在擴展另一個類的同時實現接口。C#用一種位置記號來加以區分。首先寫基類名,再寫逗號,最后寫接口名。如
interface?ILandBound
{
............
}
class Mammal
{
.................
}
class Horse:Mammal,?ILandBound
{
.................
}
一個接口可以從另一個接口繼承,這在技術上稱為接口擴展。
使用多個接口
一個類最多只能有一個基類,但可以實現不限數量的接口。
class Horse:Mammal,?ILandBound,IGrazable
{
.....................
}
顯示實現接口
interface?ILandBound
{
int NumberOfLegs(); //幾條腿
}
interface IJourney
{
int NumberOfLegs();//跑了幾站
}
class Horse :?ILandBound,?IJourney
{
.......
int?ILandBound.?NumberOfLegs()
{
return 4;
}
int?IJourney.?NumberOfLegs()
{
return 3;
}
}
如果方法是顯示接口實現的一部分,就不能為方法指定訪問修飾符。
訪問顯示實現接口的方法,通過接口引用對象:
Horse horse = new Horse();
.......
IJourney journeyHorse = horse;
int legInJourney =?journeyHorse?.NumberOfLegs();
ILandBound landBoundHorse = horse;
int legInHorse =?landBoundHorse?.NumberOfLegs();
接口的限制
①不允許在接口中定義任何字段,包括靜態字段。
②不允許在接口中定義任何構造器。
③不允許在接口中定義任何析構器。析構器包含由于析構(銷毀)對象實例的語句。
④不允許為任何方法指定訪問修飾符
⑤不允許在接口中嵌套任何類型(如枚舉、結構、類或接口)。
⑥雖然一個接口能從另一個接口繼承,但不允許從結構或者類中繼承一個接口。
抽象類
為了明確聲明不允許創建某個類的實例,必須將那個類顯式聲明為抽象類(不能封裝,不允許實例化對象),這是用abstract關鍵字完成的。如:定義一個草食性哺乳動物抽象類
abstract class GrazingMammal: Mammal,IGrazable
{
........................
}
試圖實例化一個GrazingMammal對象,代碼將無法通過編譯。
抽象方法
抽象類可以包含抽象方法。抽象方法原則上與虛方法相似,只是它不包含方法主體。派生類必須重寫(override)這種方法。抽象方法適合在以下情形下使用:一個方法在抽象類中提供默認實現沒有意義,但又需要繼承類提供該方法的實現。
? ?abstract?abstract? ?class GrazingMammal: Mammal,IGrazable
{
abstract void DigestGrass(); ?//抽象方法
........................
}
密封類
如果不想一個類作為基類使用,可以使用C#提供的sealed(密封)關鍵字防止類被用作基類。例如:
sealed class Horse: GrazingMammal,ILandBound
{
..................
}
在密封類中不能聲明任何虛方法,另外抽象類不能密封。
結構隱式密封。永遠不能從一個結構派生。
密封方法
可用sealed關鍵字密封繼承到的虛方法,阻止當前類的派生類繼續重寫該方法。只有重寫方法才能密封(用sealed override 來修飾方法)。可像下面這樣理解interface、virtual、override和sealed關鍵字
interface(接口)引入方法名稱。
virtual(虛)是方法的第一個實現,可由派生類重寫。
override(重寫)是派生類重寫的實現,是方法的第二個實現。
sealed(密封)是方法的最后一個實現,再下面的派生類不能重寫了。
轉載于:https://www.cnblogs.com/linhuide/p/5819875.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的第十三章、创建接口和定义抽象类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苏宁小店上线咖啡业务 打造更加便捷的社区
- 下一篇: 保险公司破产保费怎么办