gpt4 book ai didi

c++ - 不同类型的复合模式重用

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:09 25 4
gpt4 key购买 nike

扩展一个海军模拟项目,我希望添加复合模式,这样我就可以拥有对象组。这是当前层次结构的样子:

class Sim_object {
};

class Ship : public Sim_object {
};

class Island : public Sim_object {
};

到目前为止,我已经想出了:

class Sim_object {
// holds general sim functions
get_name()
};

// COMPONENT
class Ship_object : public Sim_object {
// holds ship functions
add()
remove()
attack()
move()
};

// COMPOSITE
class Group : public Ship_object {
// holds list of group ship functions
add()
remove()
attack()
move()
};

// LEAF
class Ship : public Ship_object {
// holds ship functions
attack()
move()
};

class Island : public Sim_object {
// holds island functions
};

我让它工作,但它只适用于船舶和船舶组。我想重用 Group 代码(添加、删除、显示等),这样一个具体的 Group 类(如 Island_group)就可以继承并使用它。我尝试更改设计,其中 Ship_group 类继承自一个名为 Group 的公共(public)基类,但我遇到了钻石程序。

有什么方法可以根据类型重用我的组控制代码?

最佳答案

复合体,为了与不止一种类型的 Sim_object 一起工作,应该继承并组合 Sim_objects:

class Sim_object { };
class Ship : public Sim_object { };
class Island : public Sim_object { };
class Group : public Sim_object {
add()
remove()
};

要将其定制为特定类型,您可以将其模板化,并(可能)从中派生其他组:

template <class T>
class Group : public Sim_object {
add()
remove()
};

class Ship_Group : public Group<Ship> {
attack()
move()
};

class Island_Group : public Group<Island> { } // possibly unnecessary

现在,要让您的 Ship_Group 替换 Ship,您可以为 Ship 创建一个“接口(interface)”(纯虚拟类)并且也从它继承 Ship_Group。您还可以在客户端代码中使用新界面而不是具体的 Ship:

class Ship_Like { // interface
attack() = 0
move() = 0
};
class Ship : public Sim_object, public Ship_Like { }; // concrete
class Ship_Group : public Group<Ship>, public Ship_Like {
attack()
move()
}

不用担心那里的菱形继承(钻石问题)......

关于c++ - 不同类型的复合模式重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10112359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com