2009-03-02 152 views

回答

37

這取決於,如果你永遠不希望能夠實例化基類然後使其抽象。否則,請將其作爲普通課程。

+1

確切地說,如果實例化基類沒有意義,請將其抽象化。 – mbillard 2009-03-02 19:53:24

0

我會說如果你不打算自己調用基類,那麼你應該把它定義爲一個抽象類。

+0

我想說這還不夠 - 如果直接實例化它是沒有意義的,那麼應該只聲明一個類抽象。無論你是否打算是一個完全不同的問題。 – 2009-03-02 19:39:37

0

這取決於您是否希望基類自行實現。

作爲一個抽象類,您無法從中創建對象。

6

這取決於它是否有意義的基礎類有問題存在它自己而不是從派生?如果答案是肯定的,那麼它應該是一個普通類,否則它應該是一個抽象類。

16

如果不應該實例化基類,那麼將其設爲抽象類 - 如果基類需要實例化,則不要將其抽象化。

在這個例子中是有意義的使基類的抽象基類沒有任何具體的含義:

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() { } 
} 

這真的很主觀 - 你應該能夠根據你的特定領域的需求做出一個很好的判斷呼叫。

0

抽象類對於預定義的功能非常適用,例如 - 知道類應該暴露的最小確切行爲,但不知道應該使用哪些數據來執行它或確切的實現。

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交談。當然,您可以根據自己的喜好混合和匹配上述所有內容。沒有確定的正確方法,但我喜歡定義接口和抽象類,然後引用接口。通過這種方式,可以在保持最大靈活性的同時,消除高層次中「管道」的一些思想要求。 (具有接口不需要使用抽象基類的要求,但將其作爲選項)。

1

抽象類用於部分實現的類。

本身沒有意義,有一個抽象類的實例,它需要派生。如果你想能夠創建基類,它不能是抽象的。

我喜歡將抽象類視爲接口,它有一些預定義的成員,因爲它們對所有子類都是通用的。

1

想到這一種不同的方式

我是一個基類,它自己的一個完整的對象?

如果答案是否定的,則將其抽象化。如果是的話,那麼你可能想把它變成一個具體的課程。

3

我建議:

  • 將界面。
  • 在您的基類中實現接口。
  • 使基類成爲真正的類,而不是抽象的(請參閱下面的原因)。

我比較喜歡的,而不是抽象類真正的類的原因是抽象類不能被實例化,從而限制未來的選擇不必要。例如,稍後我可能需要基類提供的狀態和方法,但不能繼承並且不需要實現接口;如果基類是抽象的,我運氣不好,但如果基類是普通類,那麼我可以創建一個基類的實例,並將其作爲其他類的組件,並委派給實例以重用狀態/方法提供。

是的,這並不經常發生,但重點是:當沒有理由這樣做時,使基類抽象防止這種重用/解決方案。

現在,如果實例化基類會以某種方式是危險的,然後使它抽象的 - 或者最好使它不那麼危險,如果有可能;-)

3

認爲像銀行賬戶:

你可以創建一個名爲「賬戶」的通用抽象基礎賬戶,該賬戶擁有諸如客戶詳細信息等基本信息。

然後,您可以創建兩個名爲「SavingAccount」或「DebitAccount」的派生類,它們可以具有自己的特定行爲,同時受益於基類行爲。

這是一種客戶必須擁有儲蓄賬戶或借記賬戶的情況,不允許使用通用的「賬戶」,因爲它在現實世界中不是非常受歡迎,只有賬戶沒有描述。

如果您可以根據自己的需求創建類似的場景,那麼摘要就是要走的路。

-8

我想很多人應該重新學習基本的OO課程。

OOA/OOD中的基本原理是抽象抽象抽象,直到你不能抽象。如果你看到的是一個抽象,那就這樣吧,那就是你的OOA/OOD已經告訴你的。然而,如果你坐在那裏想知道「代碼」是否應該是抽象的,那麼你顯然不知道這個術語是什麼意思,並應該再次學習基本的OOA/OOD/OOP :-)

更重要的是,你應該學習設計模式和諧波理論,這將非常有助於您的OO設計!

+8

我可以告訴你做了很多的閱讀。花些精力去學習如何寫作而不會冒犯他人。 – 2011-03-31 00:13:06