如果您有幾個類希望它們從基類繼承以獲得常用功能,那麼應該如何使用類或抽象類來實現基類?從類或抽象類繼承
從類或抽象類繼承
回答
這取決於,如果你永遠不希望能夠實例化基類然後使其抽象。否則,請將其作爲普通課程。
我會說如果你不打算自己調用基類,那麼你應該把它定義爲一個抽象類。
我想說這還不夠 - 如果直接實例化它是沒有意義的,那麼應該只聲明一個類抽象。無論你是否打算是一個完全不同的問題。 – 2009-03-02 19:39:37
這取決於您是否希望基類自行實現。
作爲一個抽象類,您無法從中創建對象。
這取決於它是否有意義的基礎類有問題存在它自己而不是從派生?如果答案是肯定的,那麼它應該是一個普通類,否則它應該是一個抽象類。
如果不應該實例化基類,那麼將其設爲抽象類 - 如果基類需要實例化,則不要將其抽象化。
在這個例子中是有意義的使基類的抽象基類沒有任何具體的含義:
abstract class WritingImplement
{
public abstract void Write();
}
class Pencil : WritingImplement
{
public override void Write() { }
}
然而,在接下來的例子中可以看到基類如何確實有具體的含義:
class Dog
{
public virtual void Bark() { }
}
class GoldenRetriever : Dog
{
public override void Bark() { }
}
這真的很主觀 - 你應該能夠根據你的特定領域的需求做出一個很好的判斷呼叫。
抽象類對於預定義的功能非常適用,例如 - 知道類應該暴露的最小確切行爲,但不知道應該使用哪些數據來執行它或確切的實現。
abstract class ADataAccess
{
abstract public void Save();
}
正常(非抽象)類可以是偉大的類似的事情,但你必須知道的實現細節,能夠給他們寫。另外,您可以使用接口(單獨或在類上,不論是否抽象)來定義相同類型的原型定義。
interface ISaveable
{
void Save();
void Insert();
void Update();
}
class UserAccount : ISavable
{
void ISavable.Save() { ... }
void ISavable.Insert() { ... }
void ISavable.Update() { ... }
}
另一個選擇,可以使用泛型
class GenDataAccess<T>
{
public void Save()
{
...
}
}
所有這些方法都可以用來定義一個特定原型的類一起工作。如何確保代碼A可以與代碼B交談。當然,您可以根據自己的喜好混合和匹配上述所有內容。沒有確定的正確方法,但我喜歡定義接口和抽象類,然後引用接口。通過這種方式,可以在保持最大靈活性的同時,消除高層次中「管道」的一些思想要求。 (具有接口不需要使用抽象基類的要求,但將其作爲選項)。
抽象類用於部分實現的類。
本身沒有意義,有一個抽象類的實例,它需要派生。如果你想能夠創建基類,它不能是抽象的。
我喜歡將抽象類視爲接口,它有一些預定義的成員,因爲它們對所有子類都是通用的。
想到這一種不同的方式
我是一個基類,它自己的一個完整的對象?
如果答案是否定的,則將其抽象化。如果是的話,那麼你可能想把它變成一個具體的課程。
我建議:
- 將界面。
- 在您的基類中實現接口。
- 使基類成爲真正的類,而不是抽象的(請參閱下面的原因)。
我比較喜歡的,而不是抽象類真正的類的原因是抽象類不能被實例化,從而限制未來的選擇不必要。例如,稍後我可能需要基類提供的狀態和方法,但不能繼承並且不需要實現接口;如果基類是抽象的,我運氣不好,但如果基類是普通類,那麼我可以創建一個基類的實例,並將其作爲其他類的組件,並委派給實例以重用狀態/方法提供。
是的,這並不經常發生,但重點是:當沒有理由這樣做時,使基類抽象防止這種重用/解決方案。
現在,如果實例化基類會以某種方式是危險的,然後使它抽象的 - 或者最好使它不那麼危險,如果有可能;-)
認爲像銀行賬戶:
你可以創建一個名爲「賬戶」的通用抽象基礎賬戶,該賬戶擁有諸如客戶詳細信息等基本信息。
然後,您可以創建兩個名爲「SavingAccount」或「DebitAccount」的派生類,它們可以具有自己的特定行爲,同時受益於基類行爲。
這是一種客戶必須擁有儲蓄賬戶或借記賬戶的情況,不允許使用通用的「賬戶」,因爲它在現實世界中不是非常受歡迎,只有賬戶沒有描述。
如果您可以根據自己的需求創建類似的場景,那麼摘要就是要走的路。
我想很多人應該重新學習基本的OO課程。
OOA/OOD中的基本原理是抽象抽象抽象,直到你不能抽象。如果你看到的是一個抽象,那就這樣吧,那就是你的OOA/OOD已經告訴你的。然而,如果你坐在那裏想知道「代碼」是否應該是抽象的,那麼你顯然不知道這個術語是什麼意思,並應該再次學習基本的OOA/OOD/OOP :-)
更重要的是,你應該學習設計模式和諧波理論,這將非常有助於您的OO設計!
我可以告訴你做了很多的閱讀。花些精力去學習如何寫作而不會冒犯他人。 – 2011-03-31 00:13:06
- 1. 從非抽象類繼承
- 2. 從抽象類繼承C#
- 3. 從抽象類繼承的靜態類?
- 4. 更新從抽象類繼承的類
- 5. 從抽象類繼承的案例類
- 6. 抽象類的繼承
- 7. 抽象類的繼承
- 8. C++抽象類的繼承
- 9. 子類,抽象和繼承
- 10. 抽象類的C++繼承
- 11. jsf繼承抽象類
- 12. Jave繼承和抽象類
- 13. 繼承抽象模板類
- 14. 具體類繼承自繼承自通用抽象類的抽象類
- 15. php抽象類繼承錯誤,沒有抽象方法繼承
- 16. 從抽象類繼承靜態變量
- 17. 抽象類難點:繼承從接口
- 18. c#接口,抽象類,強制繼承類不抽象類
- 19. 單元測試類繼承抽象類
- 20. 由另一個抽象類和非抽象類繼承抽象類
- 21. 一個抽象類繼承另一個抽象類問題
- 22. 繼承時抽象類和非抽象類有什麼區別
- 23. 從類和接口或抽象類繼承其他類時隱藏方法
- 24. 抽象或繼承用例?
- 25. 我可以從另一個抽象類繼承抽象類嗎? (JAVA)
- 26. 抽象類中的C++和繼承
- 27. JaxB繼承編組抽象類
- 28. 繼承一個模板抽象類C#
- 29. .net抽象類的多重繼承
- 30. JPA實體繼承與抽象類 - ConstrainViolationException
確切地說,如果實例化基類沒有意義,請將其抽象化。 – mbillard 2009-03-02 19:53:24