2012-05-07 244 views
0

我正在學習面向對象編程,但我對抽象類和具體類感到困惑。一些真實世界的例子將不勝感激。相互使用一個有什麼好處?什麼時候會喜歡抽象類和具體類?抽象類vs具體類?

如果答案是特定於任何語言比我在Ruby

+2

這可能會給你一些一般的想法..不是紅寶石雖然... http://stackoverflow.com/questions/2149207/what-is-the-difference-between-a-concrete-class-and-an-抽象類 – knurdy

回答

3

方面要問如果您有不能被實例化了,你應該使用抽象類的對象。但是,如果要實例化此類,則應該使用具體類。

想象一下,你想要幾個動物類。但是規則只是爲了實例化特定的動物,如狗,貓或老鼠。但現在所有這些動物都有一些屬性和方法 - 就像一個名字。所以你把它們放在基類Animal中以避免代碼重複。你不能創造雖然的Animal一個實例:

public abstract class Animal 
{ 
    public string Name { get; set; } 
    public void Sleep() 
    { 
     // sleep 
    } 
} 

public class Cat : Animal 
{ 
    public void Meow() 
    { 
     // meooooow 
    } 
} 

public void DoSomething() 
{ 
    var animal = new Animal(); // illegal operation 
    var cat = new Cat(); // works fine 
} 
+0

那麼,有人知道,爲什麼代碼突出顯示那是非常錯誤的?我在代碼中找不到錯誤:S –

+0

因爲問題被標記爲(我相信),所以SO認爲它是紅寶石。它將您的評論的第一個斜線解釋爲正則表達式的開始,並將大寫的單詞解釋爲常量。 –

0

一個抽象類通常是混凝土類的基類。 (派生,通過OO繼承)抽象類通常爲具體類實施一個接口。但是抽象類也可以通過方法和屬性實現具體類使用的通用功能。

你不能實例化一個Abstract類,只能實例化具體類,假設它們實現了所有必要的方法。

+0

「,而是隻能實例化具體的類,假設它們實現了所有必要的方法_」。我認爲這是接口的權利。從基類繼承的具體類不需要實現基類的成員。這是好處之一,也是繼承的詛咒之一。 –

+0

@ebeeb,你說得對,我指的是實現抽象方法。我不太瞭解Ruby,但是在C++和Java等其他語言中,它可能繼承自Abstract類並只實現一些抽象方法(不是所有的抽象方法),這就是爲什麼我添加了特定評論的原因。但是,如果你沒有實現所有的抽象方法,那會是一個具體的類嗎?也許它是一個命名問題。 – Brady

+0

只要你能夠實例化它,它就是一個具體的類。即使你不執行(「執行」在這裏是錯誤的詞,右邊的是「隱藏」)其中一個基本成員。如果您在具體類中「實現」了一個方法,並且具有相同簽名的方法已經存在於基類中,則可以隱藏基類實現。執行此操作的常用方法是通過基類中的'virtual'成員,可以使用'override'關鍵字覆蓋它。 –