C++ 组合继承
我正在设计一个系统,我还没有实现,首先我只是绘制它的图表,然后将对它进行编码,我想问一个简单的问题: 当我们同时使用继承和组合时该怎么办 例如,在一家酒店里,我们可以说有两种房间:标准间和双人房。为此,我可以使用继承概念,这两种房间将是派生类,但我也可以使用组合,将标准房间和双人房间分开,然后使用这是我的酒店类C++ 组合继承,c++,inheritance,class-design,composition,C++,Inheritance,Class Design,Composition,我正在设计一个系统,我还没有实现,首先我只是绘制它的图表,然后将对它进行编码,我想问一个简单的问题: 当我们同时使用继承和组合时该怎么办 例如,在一家酒店里,我们可以说有两种房间:标准间和双人房。为此,我可以使用继承概念,这两种房间将是派生类,但我也可以使用组合,将标准房间和双人房间分开,然后使用这是我的酒店类 我该怎么办?在您的站点上,我会在room类上设置room\u type属性,并将room\u type属性的类型设置为枚举类型,可能的值为STANDARD和TWIN 只要这种类型的字段没
我该怎么办?在您的站点上,我会在room类上设置room\u type属性,并将room\u type属性的类型设置为枚举类型,可能的值为STANDARD和TWIN 只要这种类型的字段没有显著的行为差异,我会保持简单
如果有复杂的行为,比如根据床位数量预测清理、更改定价等等,我会使用抽象基类CRoom,并从中继承CStdRoom和CTwinRoom,可能会在类构造函数中设置一个常量num of beds属性。I在您的站点中,我将在room类上有一个room_type属性,并将room_type属性的类型设置为枚举类型,可能的值为STANDARD和TWIN 只要这种类型的字段没有显著的行为差异,我会保持简单
如果有复杂的行为,比如根据床位数量预测清理、改变价格等等,我会使用抽象基类CRoom,并从中继承CStdRoom和CTwinRoom,可能在类构造函数中设置一个常量num of beds属性。这个问题有点模糊,缺少很多细节,但我将分享一些想法 第一件事:在设计应用程序时,最重要的是需求 您需要首先尝试识别在系统中具有某种意义的实体。假设你知道会有旅馆和房间。请注意,此关系已经是一个组合,主要原因是:
- 房间只能是一家酒店的一部分,不能在多家酒店之间共享
- 一旦酒店被毁,里面所有的房间都会被毁
Hotel
实例的生存期相关联,对于多个房间,您只需将它们放入向量即可产生相同的关系:
class Room { ... };
class Hotel {
public:
std::vector<Room> rooms;
};
教室{…};
一流酒店{
公众:
病媒室;
};
(顺便说一句,聚合最有可能由指针或引用表示)。这是另一个很好的组合示例:
如果你知道会有不同种类的房间,第一个问题应该是:这些物体会有不同的行为吗?我的系统会以不同的方式对待他们吗。。。也许你不需要追求比房间更细的粒度,一个具体房间的所有属性都会用它的属性来表达——大小、床的数量,也许几十个布尔“has”标志(“has aircon”、“has TV”、“has microwave”…),也许它的所有属性都可以用简单的“type”来表达,您将在
enum
中输入的值这个问题有点模糊,缺少很多细节,但我将与大家分享一些想法
第一件事:在设计应用程序时,最重要的是需求
您需要首先尝试识别在系统中具有某种意义的实体。假设你知道会有旅馆和房间。请注意,此关系已经是一个组合,主要原因是:
- 房间只能是一家酒店的一部分,不能在多家酒店之间共享
- 一旦酒店被毁,里面所有的房间都会被毁
Hotel
实例的生存期相关联,对于多个房间,您只需将它们放入向量即可产生相同的关系:
class Room { ... };
class Hotel {
public:
std::vector<Room> rooms;
};
教室{…};
一流酒店{
公众:
病媒室;
};
(顺便说一句,聚合最有可能由指针或引用表示)。这是另一个很好的组合示例:
如果你知道会有不同种类的房间,第一个问题应该是:这些物体会有不同的行为吗?我的系统会以不同的方式对待他们吗。。。也许你不需要追求比房间更细的粒度,一个具体房间的所有属性都会用它的属性来表达——大小、床的数量,也许几十个布尔“has”标志(“has aircon”、“has TV”、“has microwave”…),也许它的所有属性都可以用简单的“type”来表达,您将放入
enum
的值不应使用语言继承来建模业务需求继承。这使得修改或扩展业务模型变得太难了。语言继承用于实现模型的功能,而不是模型本身
相反,从“业务对象”或类似对象派生所有对象,以封装常见的内部行为,如序列化。类可以有类型,也可以使用typeinfo,或者可以使用显式类型字段。无论哪种方式,对象之间的链接,无论是类继承还是类组合,都应该是指针(或索引id字段)和集合(指针或索引id)。[您的代码片段很好,但指针会使内存管理复杂化,其中包含整数ID