介面和抽象類別

來源:互聯網
上載者:User

標籤:

抽象類別主要用作對象系列的基類,共用某些主要特性,例如,共同的目的和結構。
介面則主要用於類,這些類在基礎水平上有所不同,但仍可以完成某些相同的任務。

抽象類別和介面都包含可以由衍生類別繼承的成員。介面和抽象類別都不
能直接執行個體化,但可以聲明這些類型的變數。如果這樣做,就可以使用多態性把繼承這兩種類型的
對象指定給它們的變數。接著通過這些變數來使用這些類型的成員,但不能直接存取派生對象的其
他成員。

衍生類別只能繼承一個基類,即只能直接繼承一個抽象類別(但可以用一個繼
承鏈包含多個抽象類別)。相反,類可以使用任意多個介面。但這不會產生太大的區別——這兩種情況
取得的效果是類似的。只是採用介面的方式略有不同。

抽象類別可以擁有抽象成員,它們沒有代碼體,且必須在衍生類別中實現,否則衍生類別本身必須也是抽象的;而非抽象成員,它們擁有代碼體,也可以是虛擬,這樣就可以在衍生類別中重寫。

另一方面,介面成員必須都在使用介面的類上實現——它們沒有代碼體。另外,按照定義,介面成員是公用的,因為它們傾向於在外部使用。

但抽象類別的成員可以是私人的(只要它們不是抽象的)、受保護的、內部的或受保護的內部成員(其中受保護的內部成員只能在應用程式的代碼或衍生類別中訪問)。

此外,介面不能包含欄位、建構函式、解構函式、靜態成員或常量。

例如,假定有一個對象系列表示火車,基類Train 包含火車的核心定義,例如車輪的規格和引
擎的類型(可以是蒸汽發動機、柴油發動機等)。但這個類是抽象的,因為並沒有“一般的”火車。
為了建立一輛實際的火車,需要給該火車添加特性。為此,派生一些類,例如:PassengerTrain、
FreightTrain 和424DoubleBogey 等,所示。

也可以用相同的方式來定義汽車對象系列,使用Car 抽象基類,其衍生類別有Compact、SUV 和
PickUp,Car 和Train 甚至可以派生於一個相同的基類Vehicle,如 所示。

現在,階層中的一些類共用相同的特性,這是因為它們的目的是相同的,而不是因為它們
派生於相同的基類。例如,PassengerTrain、Compact、SUV 和Pickup 都可以運送乘客,所以它們都
擁有IPassengerCarrier 介面,FreightTrain 和Pickup 可以運送貨物,所以它們都擁有IHeavyLoadCarrier
介面,如 所示。
在進行更詳細的細分前,把對象系統以這種方式進行分解,可以清晰地看到哪種情形適合使用
抽象類別,哪種情形適合使用介面。只使用介面或只使用抽象繼承,就得不到這個樣本的結果。

 

介面和抽象類別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.