我可以对一个抽象类进行子类化吗?这个抽象类有另一个同样是子类化的抽象类?(C#)

我可以对一个抽象类进行子类化吗?这个抽象类有另一个同样是子类化的抽象类?(C#),c#,oop,C#,Oop,假设我想设计一个用于计算文档中节数的抽象系统。我设计了两个类,Document和Section,这个文档有一个节列表和一个计算它们的方法 public abstract class Document { List<Section> sections; public void addSection(Section section) { sections.Add(section); } public int sectionCount() { retu

假设我想设计一个用于计算文档中节数的抽象系统。我设计了两个类,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;
}
公共抽象类文档{
列出各节;
公营部门(部门){
节。添加(节);
}
public int sectionCount(){
返回节数;
} 
}
公共抽象类组{
公共字符串文本;
}
现在,我希望能够在多个场景中使用此代码。例如,我有带章节的书。这本书将是Document的一个子类,而Chapter则是Section的一个子类。这两个类都将包含额外的字段和功能,与节的计数无关

我现在遇到的问题是,因为文档包含章节,而不是章节,所以章节的附加功能对我来说是无用的,它只能作为一个章节添加到书中

我读到了有关“向下投射”的文章,但我真的认为这不是正确的方式。我在想也许我采取了错误的方法

我的问题是:我如何设计这样一个抽象的系统,它可以被子类对象重用,这是一种方法吗?

您需要泛型:

public abstract class Document<T> where T : Section

public abstract class Section

public class Book : Document<Chapter>

public class Chapter : Section
公共抽象类文档,其中T: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>
公共抽象类文档
其中t文档:文档
其中t节:节
公共抽象类组
其中t文档:文档
其中t节:节
公共类书籍:文档
公共课章节:第节
我必须在协议缓冲区中执行此操作,这很混乱-但它确实允许您以强类型方式引用这两种方式。如果你能成功的话,我会选择第一个版本。

你需要泛型:

public abstract class Document<T> where T : Section

public abstract class Section

public class Book : Document<Chapter>

public class Chapter : Section
公共抽象类文档,其中T: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>
公共抽象类文档
其中t文档:文档
其中t节:节
公共抽象类组
其中t文档:文档
其中t节:节
公共类书籍:文档
公共课章节:第节

我必须在协议缓冲区中执行此操作,这很混乱-但它确实允许您以强类型方式引用这两种方式。如果你不介意的话,我会选择第一个版本。

非常感谢Jon,他一整天都在摆弄这一天!威尔会读一些关于仿制药的书,但这似乎正是我想要的。非常感谢乔恩,他整天都在摆弄这一天!我将阅读泛型,但这似乎正是我想要的。虽然我同意Jon的答案实际上回答了你的问题,但我倾向于退一步,问你是否有点我称之为“对象幸福综合症”的症状。您真的需要跨一大组可能的文档/节拓扑以多态方式处理文档和节吗?在通过多态性和继承实现大规模代码重用方面,复杂类型关系增加的复杂性和由此增加的成本是“自食其果”还是仅仅是为了OOP而进行OOP?Eric,你可能是对的。也许是太多了,我让事情变得更复杂了,我自己也在想这个问题。但我觉得我不知道情况是否如此。我真正想要实现的是拥有一个抽象的“系统”,我可以重用它,而不会被诸如持久性之类的东西弄得乱七八糟。在前面提到的例子中,这本书还有一个额外的功能,就是能够坚持自己(使用ORM)。虽然我同意Jon的答案实际上回答了你的问题,但我倾向于退一步,问你是否有一点我称之为“客体幸福综合症”的症状。您真的需要跨一大组可能的文档/节拓扑以多态方式处理文档和节吗?在通过多态性和继承实现大规模代码重用方面,复杂类型关系增加的复杂性和由此增加的成本是“自食其果”还是仅仅是为了OOP而进行OOP?Eric,你可能是对的。也许是太多了,我让事情变得更复杂了,我自己也在想这个问题。但我觉得我不知道情况是否如此。我真正想要实现的是拥有一个抽象的“系统”,我可以重用它,而不会被诸如持久性之类的东西弄得乱七八糟。在前面提到的情况下,Book将具有额外的功能,即能够持久化自身(使用ORM)。