簡體   English   中英

類層次結構設計 - 接口+基類與抽象類

[英]Class hierarchy design - interfaces + base class vs. abstract class

有時我想知道我們確實有接口和抽象類,原因有兩個:

  1. 如果您只是為了設計目的而需要多個實現,並且在開發時需要編寫代碼,那么接口是我們獲得的最佳選擇。

  2. 如果你想重用代碼,那么我們可能會去抽象類。

但是,我看到的東西都不是。

在某些設計中,它就像這個Interface > BaseClass > Child類。

基本上,基類實現所有方法,然后子類從中繼承定義。 為什么我們不能使用抽象類而不是這個設置? 或者這是一個有缺陷的設置?

最簡單的方法是,如果對象具有IS-A關系,則使用(抽象)基類。 像馬一樣是一種動物。

如果存在CAN關系,那么考慮接口,就像Duck CAN飛行一樣,使用IFlying作為可以飛行的鴨子的接口。

接口可用於將多個接口實現到一個類中。 您無法從C#中的多個類派生。

本網站上發布的關於抽象類和接口的答案將幫助您了解設計差異。

這是一個設計和個人品味的問題,通常當你聲明一個你並不真正關心特定實現的接口時,你只關心接口應該提供的包裝功能。

有一個抽象類確實定義了一些指定的行為,這是你不想要的東西。

同時,具有抽象類將禁止您繼承多個,因此這將限制它可以具有的功能。

在設計類層次結構時,您會問自己“在這種情況下應該使用的對象應該做什么?” 並且為該功能定義一個接口,然后,在提供實現的同時,您可以意識到某些功能應該被分組並重用於某些子類,但它會在以后出現。

這是由於C#中禁止多重繼承類。 但它允許實現多個接口。

接口本質上是一個功能的契約; 指定某些方法和屬性。 可以針對此接口編寫代碼段,而無需了解實現細節。

抽象類可以實現某些接口,但它也可能包含所有派生類型可能需要的一些常用功能。 它還可以包括抽象或虛擬方法/屬性,允許派生類型自定義某些功能。

考慮一個場景,您構建一些對象模型,您使用接口來定義所述模型的結構,但是您希望允許該代碼的使用者在他們希望的情況下編寫自己的實現,而不會影響核心設計。 然后,您可以使用一些基類為一個實現構建自己的實現。 然后,派生類型將繼承此基類,該基類又實現對象模型的接口。 然后其他人可能會出現並編寫自己的實現,但需要一些與現有實現不同的功能或行為。 因此,他們使用常用功能編寫自己的基類,並使用自己的派生類型擴展它。

在此之后的場景,還有就是為什么不應使用同時使用一個抽象類接口,並沒有真正的理由。 這一切都取決於您的目的以及您如何構建代碼。

接口定義了一組必須實現的屬性和功能,並且可以由任意數量的類來實現。 基類沒有理由不應該實現接口。 例如,許多不同的基類可能使用IComparable。

接口的主要規則是

  1. 所有方法都應該是抽象的
  2. 沒有實施
  3. 接口可以擴展任意數量的接口
  4. 所有字段都應該是公共的,靜態的和最終的
  5. 應該在繼承的類中重寫所有方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM