2009-03-02 25 views
2

我想知道在使用抽象與真實類進行繼承時,派生類是否有任何差異?C#中抽象與真實類的繼承關係

它在我看來像真正的類繼承創建一個層次結構,而抽象類繼承只是複製粘貼到編譯器的派生類代碼?

抽象類是否創建了層次結構?它可以使用特殊的關鍵字進行訪問嗎?

我知道您使用base關鍵字來訪問基類,但抽象成員看起來就像派生類中的原始成員一樣?

最後2之間的性能差異是什麼?

+0

您能否解釋一下:「抽象成員看起來就像派生類中的原始成員?」與繼承非抽象類有什麼不同? – recursive 2009-03-02 21:27:05

回答

5

是的抽象類確實存在 - 編譯器不做複製粘貼。您不會發現任何性能差異,因爲CLR仍然必須執行虛擬方法調用。

例如下面的C#:

abstract class Foo { } 

class Bar : Foo { } 

生成以下IL:

.class private abstract auto ansi beforefieldinit Foo 
    extends [mscorlib]System.Object { } 

.class private auto ansi beforefieldinit Bar 
    extends Foo { } 

抽象類型的概念是非常多,IL的一部分。

3

唯一的區別是抽象基類不能被派生自實例,而非抽象派可以。從派生類的角度來看,一切都是一樣的。

1

抽象類和具體類都是用於(OO)建模的工具。關於繼承和替代規則沒有區別。還有一些技術性問題:

  • 一個抽象類不能被 實例
  • 摘要方法 只允許在抽象類

但一個抽象類中可以有非抽象方法,屬性和領域。

表現與類沒有關係,但對抽象/虛擬方法有一個小的懲罰。

0

抽象類的力量就是它的未實現。它可以用於確信派生類的實例將具有完整的所需功能。

0

抽象類是基類的基本形式。這些不能被實例化,這意味着開發人員必須從這些類派生出來使用它們的功能。抽象類中定義的任何抽象方法都必須在其子類中實現。所以我們可以實現必須存在於從抽象類派生的子類中的方法。 因此,您可以根據自己的喜好定義開發人員在派生類中定製的對象的基本元素。

非抽象類最適合用於擴展類的功能,同時還可以繼續使用非抽象類中的內容。所有非私有成員和方法都可以由派生類訪問。