2010-04-08 122 views
32

從非抽象類派生抽象類還是出現這種方法有什麼問題?從非抽象類派生抽象類

Here's一個小例子:

public class Task { 
    // Some Members 
} 

public abstract class PeriodicalTask : Task { 
    // Represents a base class for task that has to be done periodicaly. 
    // Some additional Members 
} 

public class DailyTask : PeriodicalTask { 
    // Represents a Task that has to be done daily. 
    // Some additional Members 
} 

public class WeeklyTask : PeriodicalTask { 
    // Represents a Task that has to be done weekly. 
    // Some additional Members 
} 

在上面,我不想讓類任務抽象的,因爲我想直接實例它的例子。 PeriodicalTask​​應該繼承Task中的功能並添加一些額外的成員,但我不想直接實例化它。只有派生類的PeriodicalTask​​應該被實例化。

回答

49

我沒有看到這種方法有什麼問題。

您可能有一些基本類型可以用具體的術語來描述。現在,僅僅因爲這種類型的對象可能會根據某種子類型進一步分類,並不表示所有這些子類型都具有同樣的含義;它們可能反過來需要進一步的具體化,就像它一樣。

真實的例子:

Person - 混凝土(非抽象)
Sibling: Person - 抽象
Brother: Sibling - 混凝土
Sister: Sibling - 混凝土

+2

完美實例Dan – 2010-04-08 19:29:12

+0

良好示例因此接受 – Jehof 2010-04-09 06:01:21

+0

哇!真的,很好的例子。 – ManuelSchneid3r 2012-12-07 11:31:36

0

例如,使用抽象不是正確的方法,那麼使用受保護或內部構造函數。這將阻止直接創建PeriodicalTask​​的實例,但其派生類仍可以訪問它。

+0

你能否詳細說明一下?是的,受保護的/內部的構造函數可以阻止創建「PeriodicalTask​​」的實例。但是它也需要任何來自'Task'的抽象方法/屬性來實現。 – 2010-04-08 19:22:29

+0

沒關係......我錯過了這個任務不是抽象的。在這種情況下,兩種方法都可以起到同樣的作用。其他則不能強迫某人在派生類中實現方法。 – 2010-04-08 19:26:02

+0

@kprobst:是的,我可以做到這一點,但後來我失去了定義抽象成員的可能性,必須通過派生類型來實現。虛擬成員不可選,導致派生類型必須定義它們的工作方式 – Jehof 2010-04-09 06:05:49

17

它沒有問題。

如果你看一個像WinForms這樣的大層次結構,你會發現幾層抽象類型。

MSBuild任務也是一個很好的(也是更相關的)例子。

12

這類t hing始終發生:所有抽象類繼承自System.Object,它本身不是abstract

new System.Object()有時可用於鎖定,如果你周圍沒有其他東西,你可以鎖定。

+0

它是一個很好的觀點。這一事實我錯過了,導致從System.Object的繼承不得設置顯式。 – Jehof 2010-04-09 06:09:54