簡體   English   中英

如果你有一個只有抽象方法的Abstract類怎么辦?這與界面有什么不同?

[英]What if you had an Abstract class with only abstract methods? How would that be different from an interface?

根據我的經驗,我認為以下是正確的。 如果我錯過了重點,請告訴我。

接口:

在接口中聲明的每個單獨的方法都必須在子類中實現。 接口中只能存在事件,代理,屬性(C#)和方法。 一個類可以實現多個接口。

抽象類:

只有抽象方法必須由子類實現。 Abstract類可以有實現的常規方法。 Abstract類還可以在Events,Delegates,Properties和Methods旁邊有類變量。 由於C#中不存在多重繼承,因此類只能實現一個抽象類。

所以,即使這種差異也無法解釋這個問題

1)如果你有一個只有抽象方法的Abstract類怎么辦? 這與界面有什么不同?

2)如果你在界面中有一個Public變量,那么它與Abstract Class有什么不同呢?

所以任何解釋都會有所不同。

在Java中:

abstract class可以implement interface

interface 不能 extend abstract class

順便說一句:奇怪的是 - abstract class可以implementinterface而不實際這樣做。

interface I {
  public String hello ();
}

interface J {
  public String goodbye ();
}

abstract class A implements I, J {
  @Override
  abstract public String hello ();
}

class B extends A {

  @Override
  public String hello() {
    return "Hello";
  }

  @Override
  public String goodbye() {
    return "goodbye";
  }

}

接口的所有變量默認為public和static,您不能在接口中只有一個公共變量,而在Abstract類中,您可以聲明一個公共變量。

如果類擴展了Abstract類,則它們之間沒有任何契約。 擴展它的類可能會或可能不會覆蓋抽象方法,但是在接口的情況下,接口和實現它的類之間存在嚴格的約定,即類必須覆蓋該接口的所有方法。 因此從抽象方法的角度來看,它們似乎是相同的,但具有完全不同的屬性和優點。

除了技術差異之外,主要是您的設計內涵會導致您決定使用其中一個:

接口定義實現它們的類的公共API 您使用接口的目標應該是顯示實現它的類的用法。 這不是副作用,而是一個中心設計目標,類可以實現不同的接口來顯示它可以作用的不同角色。

抽象類應該實現一些基本算法常見行為 它主要是在一個地方加入子類的通用功能。 其目的是定義內部使用或流,而不是公共接口。 如果要發布抽象類的用法,它應該實現一個單獨的接口。

所以:

1)當您使用上述指南時,只使用公共抽象方法的抽象類沒有任何意義。 抽象類可以定義受保護的抽象方法來定義流或算法。 但是接口無法做到這一點。

2)通常對公共屬性抽象類可以定義受保護的實例變量,因此有更多的使用場景(參見上面的解釋)。

編輯:作者刪除了“java”標簽。 我盡量使這個盡可能通用,對於java和C#都應該是這樣的

雖然你的問題表明它是“普通OO”,但它似乎真正關注.NET對這些術語的使用。

  • 接口可以沒有狀態或實現
  • 實現接口的類必須提供該接口的所有方法的實現
  • 抽象類可能包含狀態(數據成員)和/或實現(方法)
  • 可以在不實現抽象方法的情況下繼承抽象類(盡管這樣的派生類是抽象的)
  • 接口可能是多重繼承的,抽象類可能不是(這可能是接口與abtract類分開存在的關鍵具體原因 - 它們允許實現多重繼承,從而消除了一般MI的許多問題)。

作為一般的OO術語,差異不一定是明確的。 例如,有些C ++程序員可能持有類似的嚴格定義(接口是不能包含實現的抽象類的嚴格子集),而有些人可能會說具有某些默認實現的抽象類仍然是接口或非抽象接口class仍然可以定義一個接口。

實際上,有一種稱為非虛擬接口(NVI)的C ++習慣用法,其中公共方法是非虛擬方法,可以“竊取”私有虛擬方法:

http://www.gotw.ca/publications/mill18.htm http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface

如果你有一個只有抽象方法的Abstract類怎么辦? 這與界面有什么不同?

  • 您可以實現多個接口,但只能擴展一個類
  • 抽象類更能變化則接口,如果你改變它會打破這個類實現它的接口監守。
  • 接口只能有static final字段。抽象類可以有任何類型的字段。
  • 接口沒有構造函數,但抽象類可以擁有它

但java 文檔說這個

如果抽象類只包含抽象方法聲明,則應將其聲明為接口。

即使今天的抽象類版本中的所有方法都是抽象的,該類的未來版本也可以添加虛擬或非虛擬方法,而無需強制修改實現或重新編譯使用者。 相反,將任何成員添加到接口通常需要修改實現接口的所有類以實現該成員,並且無論更改是否添加了尚未實現的任何內容,通常都必須重新編譯實現和使用者。

在不破壞實現或消費者的情況下可以更改抽象更改的事實是支持抽象類的一大優勢。 另一方面,抽象類將強制任何實現類僅從它派生而不是從其他類派生。 相比之下,接口幾乎會限制其實現者可以繼承或派生的內容。 這是支持接口的一大優勢。

因為抽象類和接口都有明確的優點,所以有時候哪一個可能比另一個好。 從概念上講,可以在界面工作方式中添加一些功能,這些功能可以為他們提供目前僅由抽象類提供的優勢,但我知道沒有特別的計划。

您的類只能擴展一個抽象類並實現許多接口。

好吧,在抽象類中你也可以有字段,並且不需要重新實現自動屬性。 您還可以指定非public訪問說明符。 此外,它具有更好的可伸縮性(例如,您可以使用[Obsolete]標記舊的實現,然后默認調用舊的實現)。 此外,它會阻止你再繼承類。 另一件事是你可以在抽象類中設置靜態字段。

此外,接口通常是一些執行一個動作,而類是大約在於

*1) What if you had an Abstract class with only abstract methods? How would that be different from an interface?*

默認情況下,接口中的方法是“公共抽象”,抽象類也將抽象方法稱為“公共抽象”。 如果抽象類只包含抽象方法,那么最好將它作為一個接口。

*2) What if you had a Public variable inside the interface, how would that be different than in Abstract Class?*

接口不能有變量。 如果您的意思是屬性,事件,代表等......它們默認為“公共”。 如果抽象類中沒有指定任何內容,那么它將是“Private”(僅針對接口/抽象類的成員)。

當您希望您的班級能夠做某事時,使用一個界面。

當存在'is a'關系時,您的類會擴展一個抽象類。

存在語義差異。

在抽象類的情況下。

class Dog : abstractAnimal

當我們創建Dog的對象時,我們將不得不創建abstractAnimal的對象,它將導致額外的對象創建。

在接口的情況下。

class Dog : IAnimal

當我們創建Dog的對象時,我們不會創建任何任何額外的對象。

在這種情況下,你可以說:

1)我們可以為類中存在的方法指定不同的訪問修飾符,但是我們不能更改Interface成員的訪問修飾符。

2)摘要中的派生類不會強制執行。

暫無
暫無

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

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