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