C 介面和抽象類的總結

2021-06-18 14:48:48 字數 3413 閱讀 6089

一、介面的簡單實現

介面更好地實現了多型,體現了約定和實現相分離的原則。通過面向介面程式設計,可以降低**間的耦合性,提高**的可擴充套件性和可維護性。在物件導向程式設計中,提倡面向介面程式設計,而不是面向實現程式設計。面向介面程式設計意味著,開發系統時,主體架構使用介面,介面構成系統的骨架,這樣就可以通過更換實現介面的類來實現更換系統。乙個類實現的某個介面,就表示這個類具有了某種能力,這個能力具體體現在實現介面的方法上。

如下**,有乙個duck父類,它有三個子類,realduck、woodduck、rubberduck。其中realduck和rubberduck會叫,只是叫聲不一樣,woodduck不會叫。有乙個鴨子叫的介面ibark。

/// /// 鴨類

///

public class duck

}//鴨子叫的介面

public inte***ce ibark

/// /// 真實的鴨子

///

public class realduck : duck, ibark

}/// /// 橡皮鴨

///

public class rubberduck : duck, ibark

}/// /// 木頭鴨

///

public class woodduck : duck

在main()方法中,當我們想要讓鴨子叫時,不能用父類變數指向會叫的鴨子物件,因為這樣會讓這個變數無法呼叫子類鴨子叫的方法,而是應該用介面來宣告這個變數。**如下:
static void main(string args)

這樣在控制台上顯示的結果是「嘎嘎叫...」。

二、顯式實現介面

先看如下示例**,乙個具有飛行功能的介面iflyable,乙個可以飛行的超人介面isuperman,這兩個介面裡面有乙個同名的飛行方法fly,另外有乙個學生類同時繼承了這兩個介面,並且實現了介面所具有的fly()方法,乙個是直接實現,乙個是顯式實現。

//具有飛行功能的介面

public inte***ce iflyable

//具有飛行功能的超人介面

public inte***ce isuperman

public class student : iflyable,isuperman

void isuperman.fly()

}

在main方法中,我們讓三個不同型別的變數分別指向乙個學生物件,如下:
static void main(string args)

執行程式,結果如圖所示:

從上面可以看出,顯式實現的fly方法的物件只有用實現該顯式方法的介面來宣告,我們才可以呼叫這個顯式方法。在上面的**中,你會發現,顯式實現的方法前面沒有訪問修飾符,也就是預設為private,而直接實現的方法的訪問修飾符是public。如果在顯式實現的方法前面加乙個public訪問修飾符,那麼程式就會報錯,如圖所示:

錯誤資訊提示我們:修飾符public對該項無效。這也告訴我們,顯式實現介面的方法必須為private。既然這個方法是私有的,那在外界就不能訪問了,那我們用isuperman型別的變數指向的student物件為什麼又可以訪問到呢?因為這個物件訪問的是isuperman介面中的fly方法,而所有介面中的方法都預設必須為public,並且繼承這個介面的student類已經顯式的實現了這個fly方法,所以可以訪問到。顯式實現介面的目的,就是為了解決方法重名的問題。

假如我們把student類中直接實現的iflyable介面的方法刪掉,然後讓這個介面也顯式實現其方法,如下所示:

public class student : iflyable,isuperman

void isuperman.fly() //顯式實現isuperman介面的方法

void iflyable.fly() //顯式實現iflyable介面的方法

}

那麼,在main方法中,我們會發現程式報錯,如圖:三、介面特點的總結:

1.介面是一種規範,是為了更好的實現多型。

2.介面不能被例項化。

3.介面中的成員不能加訪問修飾符。因為介面中的成員的訪問修飾符預設就為public,不能修改。

4.介面中的成員不能有任何實現(也就是光說不做,只是定義了一組未實現的成員)。

5.介面中只能有方法、屬性、索引器、事件,不能有欄位。

6.介面與介面之間可以繼承,並且可以多繼承。

7.實現介面的子類必須實現該介面的全部成員。

8.乙個類可以同時繼承乙個類並實現多個介面,如果乙個子類同時繼承了父類a,並且實現了介面ia,那麼語法上a必須寫在ia的前面,因為類是單繼承的。

9.當乙個抽象類實現介面的時候,如果不想把介面中的成員實現,可以把該成員實現為abstract。

10.顯式實現介面,只能通過介面變數來呼叫,因為顯式實現介面後,成員必須為private(上面已有示例)。

四、使用介面的建議:

面向抽象程式設計,我們提倡使用抽象(父類、抽象類、介面)而不使用具體,我們在程式設計時:

1.在定義方法返回值、引數、宣告變數的時候能使用抽象就不要用具體。這個順序一般為:介面→抽象類→父類→具體類。

2.能使用介面就不用抽象類,能用抽象類就不使用父類,能用父類就不使用子類。

3.避免定義體積龐大的介面和多功能介面,這樣會造成介面汙染。只需要把相關聯的一組成員定義到乙個介面中,盡量在介面中少定義成員,這就是單一職責原則。

4.我們一般應定義多個職責單一的介面來組合使用。

五、抽象類的特點

1.不能被例項化,需要被繼承,這是為了實現多型。

2.子類必須重寫父類所有的抽象成員,除非子類也是乙個抽象類。

3.抽象成員在父類中不能的任何實現。

4.抽象類中可以有例項成員。

5.抽象成員的訪問修飾符不能是private。

6.抽象成員只能寫在抽象類中。

六、抽象類和介面的區別

1.抽象類適用於同一系列(型別),並且有需要繼承的成員。

2.介面適用於不同系列的類具有相同的動作(行為、動作、方法)。

3.對於不是相同的系列,但具有相同的行為時,就應該要使用介面。

4.介面解決了類不能多繼承的問題。

抽象類 和 介面總結

抽象類和介面本質的區別 首先要明確,介面不是類,所以也不是抽象類。類是屬性和方法容器,但是這些屬性和方法沒有任何區別的堆積在一起,當開發人員要尋找某個方法時,將很不方便,這個時候,介面出現了,介面的出現就是為了解決這個問題。介面將類的內部屬性和方法進行分類,定義不同功能組的屬性和方法。抽象類體現的是...

抽象類和介面總結

當兩個類有著共同方法,共同的屬性,子類實際上是父類的乙個特殊形式,對於子類的特殊性則通過實行抽象方法去實現,應該定義個抽象模擬較合理,大大減少了重複 量。而如果只是規則相同,例如都需要實現相同的方法,方法內容是不同的,則應該使用介面比較合理,實現了多型。總而言之,介面與抽象類的區別主要在於使用的動機...

c 介面和抽象類學習總結

下面例項定義了乙個抽象類和乙個介面,抽象類中定義乙個手機的屬性和方法,介面定義乙個玩遊戲的方法。抽象類 抽象類是乙個父類 約束 父類是為了實現 重用 約束是為了多型變化 單繼承 is a public abstract class basephone public string name publi...