2009-06-19 87 views
1

可以說我想設計一個抽象系統來計算文檔中的部分。我設計了兩個類,文檔部分,該文檔有一個部分列表和一個方法來計數它們。我可以繼承具有另一個也是子類的抽象類的抽象類嗎? (C#)

public abstract class Document { 
    List<Section> sections; 

    public void addSection(Section section) { 
    sections.Add(section); 
    } 
    public int sectionCount() { 
    return sections.count; 
    } 
} 
public abstract class Section { 
    public string Text; 
} 

現在,我希望能夠在multipe場景中使用此代碼。例如,我有書籍和章節。 Book是Document的子類,Chapter是Section的子類。這兩個類都將包含額外的字段和功能,與計算章節無關。

我偶然發現現在的問題是,由於文檔中包含的部分,而不是章節,第一章的新增功能是對我沒用,只能添加部分圖書。

我正在閱讀關於向下傾斜的內容,但真的認爲這不是正確的方法。我想也許我完全採取了錯誤的做法。

我的問題是這樣的:我如何設計這樣一個抽象系統,可以被子類對象重用,並且這是要走的路嗎?

+0

雖然我同意Jon的回答實際上回答了你的問題,但我會傾向於退後一步,詢問你是否可能沒有受到我稱之爲「對象幸福綜合徵」的痛苦。您是否真的需要通過多種可能的文檔/節拓撲來對文檔和節進行多態處理?在通過多態和繼承進行大規模代碼重用方面,複雜類型關係的「複雜性」增加了複雜性,從而增加了成本?還是僅僅爲了OOP而使用OOP? – 2009-06-19 16:03:26

+0

埃裏克,你可能是對的。也許這很重要,我會加入很多複雜的問題,我其實自己也在想這個。但我覺得我不知道這是否是這種情況。我真正想要完成的是有一個抽象的「系統」,我可以重複使用它,並且不會像例如持久性那樣混亂。在上述情況下,Book將具有能夠自我保持的附加功能(使用ORM)。 – 2009-06-22 07:05:17

回答

6

你需要仿製藥:

public abstract class Document<T> where T : Section 

public abstract class Section 

public class Book : Document<Chapter> 

public class Chapter : Section 

你可能要打個部分知道什麼樣的文件也可以成爲其中的一部分。不幸的是變得複雜多了:

public abstract class Document<TDocument, TSection> 
    where TDocument : Document<TDocument, TSection> 
    where TSection : Section<TDocument, TSection> 

public abstract class Section<TDocument, TSection> 
    where TDocument : Document<TDocument, TSection> 
    where TSection : Section<TDocument, TSection> 

public class Book : Document<Book, Chapter> 

public class Chapter : Section<Book, Chapter> 

我不得不這樣做在協議緩衝區,它的雜亂 - 但是它允許你在一個強類型的方式引用兩種方式。如果你能擺脫它,我會選擇第一個版本。