回答
方面要問如果您有不能被實例化了,你應該使用抽象類的對象。但是,如果要實例化此類,則應該使用具體類。
想象一下,你想要幾個動物類。但是規則只是爲了實例化特定的動物,如狗,貓或老鼠。但現在所有這些動物都有一些屬性和方法 - 就像一個名字。所以你把它們放在基類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
}
那麼,有人知道,爲什麼代碼突出顯示那是非常錯誤的?我在代碼中找不到錯誤:S –
因爲問題被標記爲(我相信),所以SO認爲它是紅寶石。它將您的評論的第一個斜線解釋爲正則表達式的開始,並將大寫的單詞解釋爲常量。 –
一個抽象類通常是混凝土類的基類。 (派生,通過OO繼承)抽象類通常爲具體類實施一個接口。但是抽象類也可以通過方法和屬性實現具體類使用的通用功能。
你不能實例化一個Abstract類,只能實例化具體類,假設它們實現了所有必要的方法。
「,而是隻能實例化具體的類,假設它們實現了所有必要的方法_」。我認爲這是接口的權利。從基類繼承的具體類不需要實現基類的成員。這是好處之一,也是繼承的詛咒之一。 –
@ebeeb,你說得對,我指的是實現抽象方法。我不太瞭解Ruby,但是在C++和Java等其他語言中,它可能繼承自Abstract類並只實現一些抽象方法(不是所有的抽象方法),這就是爲什麼我添加了特定評論的原因。但是,如果你沒有實現所有的抽象方法,那會是一個具體的類嗎?也許它是一個命名問題。 – Brady
只要你能夠實例化它,它就是一個具體的類。即使你不執行(「執行」在這裏是錯誤的詞,右邊的是「隱藏」)其中一個基本成員。如果您在具體類中「實現」了一個方法,並且具有相同簽名的方法已經存在於基類中,則可以隱藏基類實現。執行此操作的常用方法是通過基類中的'virtual'成員,可以使用'override'關鍵字覆蓋它。 –
- 1. 一個具體的類VS抽象類
- 2. 抽象類和具體類
- 3. 抽象類擴展的具體類
- 4. 使用抽象構建器vs具體類和具體構建器擴展抽象類
- 5. 具體類繼承自繼承自通用抽象類的抽象類
- 6. 抽象類中的具體方法
- 7. 從具體的整數類型抽象
- 8. @MappedSuperclass VS純抽象類
- 9. 接口vs 100%抽象類
- 10. 數據結構 - 抽象數據類型(ADT)VS具體數據類型(CDT)
- 11. 作爲超類型的抽象基類與具體類
- 12. 當抽象類擴展具體類時,繼承的成員是抽象的嗎?
- 13. Class Vs抽象類與Vs接口
- 14. 教義實體抽象類
- 15. 在抽象基類中使用具體實現類型
- 16. C#抽象類,使用匿名而不是聲明具體類?
- 17. 抽象類型在具體類中的使用?
- 18. 抽象類表每個具體類型的配置
- 19. 抽象超類或每個具體子類中的@PersistenceContext?
- 20. 實現從抽象類可比接口與具體的子類
- 21. 派生一個抽象模板類從具體類
- 22. 通過具體的類測試抽象類
- 23. Java:如何確定抽象類型的具體類型?
- 24. java - 抽象類和具體類之間的獨特區別
- 25. 如何具體設置綁定類型的抽象類型?
- 26. 包含在具體類中的抽象類
- 27. 覆蓋抽象方法的返回類型與具體類型
- 28. 具有抽象類參數的抽象方法的Java抽象類
- 29. 多表,抽象類,實體類型
- 30. 使用抽象類中抽象類的引用抽象類c
這可能會給你一些一般的想法..不是紅寶石雖然... http://stackoverflow.com/questions/2149207/what-is-the-difference-between-a-concrete-class-and-an-抽象類 – knurdy