2010-08-09 75 views
9

我很驚訝地發現C#中的抽象類沒有抽象方法。抽象類沒有任何抽象方法

abstract class AbstractDemo 
{ 
public void show() 
    { 
    Console.WriteLine("In Show Method"); 
    } 
} 
class MainDemo:AbstractDemo 
{ 
public static void Main() 
{ 
    Console.WriteLine("In Main Method"); 
} 
} 

任何解釋?

回答

20

有時你不想讓實例化一個類的可能性,但你需要這個類作爲其他類的基類。

選擇接口上的抽象類的原因是你可以提供一些基本的實現。

+0

好吧,這意味着我們可以將這樣的抽象類用作其他類的標記類。 – 2010-08-09 10:57:47

+0

確實如此 - 但如果您不需要實現,則可以使用接口。 – 2010-08-09 11:06:43

0

如果你的類只是其他類的基礎,並且它沒有完整的可用性 - 換句話說,作爲一個基本itselfe根本不可用,那麼你想阻止創建它的實例。在這種情況下,您可以創建抽象類而不使用抽象成員。

2

我認爲你讓抽象類與接口混淆。接口不能具有正文的方法,抽象類可以。有時你想阻止用戶實例化一個特定類的對象;但仍然爲從它派生的類提供一些基本功能;這是一個抽象類是有用的。

+0

那麼絕對沒有方法的抽象類呢?甚至沒有定義。 – 2010-08-09 11:00:34

+0

@Nadeem在這種情況下,它幾乎與「標記」界面相同(即沒有任何東西,只是爲了標記一個類;注意FxCop建議使用Attributes)。不同的是,你只能有一個基類(比如你的「標記抽象類」),但是可以實現很多接口。所以在這種情況下,接口通常會更好。 – 2010-08-09 11:05:28

+0

是的,但假設我們想擁有該類的某些屬性,並且如果我們使用接口,那麼默認情況下它們將是公開的,這將違反OOPS的基本數據隱藏原則。 – 2010-08-09 11:20:59

1

抽象類是一個必須在可以使用之前進行擴展的類。這並不意味着函數本身必須是抽象的。

就拿一個動物類

public abstract class Animal 
{ 
    void Move() 
    { 
     //whatever 
    } 
} 

public class Fish : Animal 
{ 
    void Swim() 
    { 

    } 
} 

public class Dog : Animal 
{ 
    void Bark() 
    { 

    } 
} 

所有的動物都可以移動,但只有魚可以游泳和狗能吠叫。

或者一個真實的例子。我在我的應用程序中使用了一個Asp.net MVC基礎控制器。它具有我經常需要的一些基本方法,如GetCurrentUser()和我寫的用於幫助本地化的函數。它還負責跟蹤,因此我不必在所有控制器中重寫該代碼。該類有大約200行代碼,但不是一個抽象方法。

+7

其實,我想你會發現大多數狗都會游泳;) – 2010-08-09 10:40:23

+2

好點,應該找到不同的動物:) – Sruly 2010-08-09 10:47:37

11

如果要提供事件類似的行爲這是完全有效的,偶爾有用:提供一個抽象類與無所事事的默認行爲,虛擬方法來實現所有的「事件處理程序」。

派生類然後可以覆蓋某些的方法,但不必覆蓋任何特定的方法,因爲沒有什麼是抽象的。因爲基類的一個實例是毫無意義的(因爲所有的東西都是不可操作的),所以這個類仍然是抽象的。

然而,這種模式在Java中比C#更常見,因爲在C#中,您通常只使用「正確的」事件。

0

你可以在一個類上使用abstract關鍵字來告訴編譯器它只能從它繼承,而不是直接;在這種情況下,你不應該把抽象成員放在課堂上。

這相當於在類中只放入一個受保護的構造函數,但使用抽象更清晰易懂。

0

沒有更好的解釋比MSDN它的自我 http://msdn.microsoft.com/en-us/library/aa645615(v=VS.71).aspx

  • 一個抽象類不能直接實例化,它是使用新的 操作上的抽象類 編譯時錯誤。雖然 它有可能具有的變量和 值,其編譯時間類型是 抽象,這樣的變量和值 必然要麼爲空值或 包含從 抽象類型派生的 非抽象類的實例的引用。
  • 抽象類允許(但不是必需)包含摘要 成員。
  • 抽象類不能被密封。
0

我們聽說抽象類中必須有一個abstarct成員。但是,當我編譯abstarct類沒有抽象方法時,它編譯。它給了我驚喜。現在我無法找到解釋abstarct類的確切行爲的文章。

+0

你可能會混淆C++和C#... – Ants 2016-12-27 02:35:24