让我们说我想设计一个抽象系统来计算文档中的部分。我设计了两个类, Document 和 Section ,该文档有一个部分列表和一个计算它们的方法。
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;
}
现在,我希望能够在多种情况下使用此代码。例如,我有章节书籍。本书将是Document的子类,而Chapter是Section的子类。这两个类都将包含额外的字段和功能,与计数部分无关。
我现在遇到的问题是,因为Document包含部分而不是章节,所以章的附加功能对我来说是无用的,它只能将作为部分添加到Book中。
我正在阅读有关向下倾斜的信息,但我认为这不是正确的方法。我想也许我完全采取了错误的做法。
我的问题是:我如何设计这样一个抽象系统,可以被子类化对象重用,这是要走的路吗?
答案 0 :(得分: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>
我必须在Protocol Buffers中执行此操作,并且它很麻烦 - 但它确实允许您以强类型方式引用这两种方式。如果你能逃脱它,我会选择第一个版本。