2009-06-19 79 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> 

我不得不这样做在协议缓冲区,它的杂乱 - 但是它允许你在一个强类型的方式引用两种方式。如果你能摆脱它,我会选择第一个版本。