Oop 正确的类层次结构

Oop 正确的类层次结构,oop,design-patterns,Oop,Design Patterns,一般情况下,我们有以下文档类型: 带有标题部分的文件(C类文件标题) 带有标题和详图部分的文件(C类文件详图) 这两个类都是抽象的,我们需要继承它们以实现所需的功能: 类文档头{} 类DocumentDetail:DocumentHeader{} 接下来,我们有具体的文件: 合并订单。包含订单的合并数据(类订单) 详细的订单。包含合并数据和表部件,其中包含有关订购产品的详细信息(OrderDetail类) 因此,我们有一个问题: 详细订单应继承合并订单的功能: 类OrderDeta

一般情况下,我们有以下文档类型:

  • 带有标题部分的文件(C类文件标题)
  • 带有标题和详图部分的文件(C类文件详图)
这两个类都是抽象的,我们需要继承它们以实现所需的功能:

  • 类文档头{}
  • 类DocumentDetail:DocumentHeader{}
接下来,我们有具体的文件:

  • 合并订单。包含订单的合并数据(类订单)
  • 详细的订单。包含合并数据和表部件,其中包含有关订购产品的详细信息(OrderDetail类)
因此,我们有一个问题:

详细订单应继承合并订单的功能:

  • 类OrderDetail:Order{}
详细订单和合并订单都应从抽象类继承:

  • 类顺序:DocumentHeader{}
  • 类OrderDetail:DocumentDetail{}

请给出一个想法,如何实现这一点。谢谢 Psuedo-ish代码类似于

class CDocument
{
  public:
    CDocument ( IDocumentHeader header, IDocumentDetails details ) : 
      this.header(header), this.details(details) {}

    IDocumentHeader GetHeader() { return header; }
    IDocumentDetails GetDetails() { return details; }

  private:
    IDocumentHeader header;
    IDocumentDetails details;
};
不能完全确定订单/订单详细信息的关系,但可以将订单作为CDocument,其中包含DocumentDetails的DocumentHeader实现和OrderDetail实现

class CDocumentHeader : IDocumentHeader{};

class COrderDetail : IDocumentDetail{};

void Whatever()
{
  CDocument order ( new DocumentHeader(), new OrderDetail() );
}

在支持mixin/多重继承的语言中,您可以这样做。在只有单一继承的语言中,您需要使用成员模拟混合。我建议将
DocumentDetail
作为
OrderDetail
的一个单独的类,并将功能委托给它。我非常怀疑OrderDetail是否应该从Order继承。如果OrderDetail是一个容器/文档/或GUI组件,那么它应该是与订单的组合关系。OrderDetail包含一个订单。那么你就不必担心多重继承了。我100%同意@OliverWatkins
OrderDetail
Order
继承的观点。我不同意应该审查继承。“偏好组合而非继承”。也许您甚至需要类型标题和详细信息,并让您的文档类型使用与它们的has-a关系。