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%同意@OliverWatkinsOrderDetail
从Order
继承的观点。我不同意应该审查继承。“偏好组合而非继承”。也许您甚至需要类型标题和详细信息,并让您的文档类型使用与它们的has-a关系。