哪种类型的继承更可取
Which type of inheritance is more preferable?
实现第二种情况的唯一要点是,如果我想从一个可碰撞的而不是对象派生?如果是这样的话,第一种情况何时有利,因为第二种情况提供了更多的灵活性。
两个collidables都只有一个纯虚拟函数,Object是可以在屏幕上绘制的对象的基类(在我的例子中)。
^假设我正确理解以下代码(我不太确定TBH)
class Object
class CollidableObject : Object
class Actor : public CollidableObject
class Object
class Collidable
class Actor : public Object, public Collidable
编辑:
基于Matt/Seth
class Object
class Collidable
class Clickable
class Trackable
class BlowUppable
class Actor : public Object, public Collidable, public Clickable, public Trackable,
public BlowUppable
class SomeObjectThatIsTakenForGrantedThatEverythingElseIsInherited : public Actor
第一个例子是第二种情况,第二个例子是第一种情况。我想这是我在第一种情况下看到的唯一用途。
@卢锡安
这将是一个不同于原来的问题,因为你的回答都不是。
在这种情况下,将对象从is-a关系更改为has-a关系有区别吗?在每种情况下,为了检查碰撞,对象必须有一个标志,以知道是否应该检查碰撞。在您的情况下,可以检查成员是否为null,但在派生情况下,对象本身告诉它是否可以碰撞。在数组/树中,我可以将派生对象作为参数传递,也可以使用get()方法将hitbox作为参数传递。
为了更深入,我有另一个类-使用第二种情况
class Hitbox : public Object, public Collidable
Actor类将其作为的成员
class Actor : public Object
{
Hitbox *box;
};
发生碰撞的对象会有一个点击框,我认为这准确地代表了你的帖子。但仍然让我感到困惑的是,当我再次回顾你的例子时,这是否意味着Hitbox应该有一个可碰撞成员?
class Hitbox
{
Collidable *collision;
};
我拥有的:
一个参与者持有一个处理碰撞的点击框
Hitbox应该做什么:
继承可碰撞或
作为成员具有可碰撞性
演员已经在按惯例行事了。Hitbox也应该这样做吗?
我会做第二种情况,因为Object
和Collidable
是交叉关注的问题。如果你走CollidableObject
路线,你可能会以类的组合爆炸结束。过不了多久你就会看到CollidableTrackableClickableBlowuppableObject
。
由于Collidable
是纯虚拟的,因此在本例中它被用作接口,因此没有太多反对多重继承的批评。您只是简单地说明Actor实现了Collidable
接口。
这是战略模式的完美场景。这就是英语欺骗我们的地方,让我们认为CollidableObject
是这个层次结构中的一个有效对象。我认为碰撞更多的是一种行为,而不是一个物体,所以我不同意这两者。
首选成分:
class Object
{
CollidableBehavior* collisionBehavior;
}
class Actor : Object
{
// collisionBehavior = new ActorCollision()
}
class AClassThatDoesntCollide
{
// collisionBehavior = NULL
}
实现第二种情况的唯一要点是如果我想推导来自可碰撞而不是物体?
是的,第二种情况为您提供了更大的灵活性,因为它允许分离接口。例如,稍后您可能想要一个可冷却但不可绘制的对象。
第一种情况何时有利,因为第二种情况提供了更多灵活性
第二种情况提供了更大的灵活性,但设计起来也更复杂。最后,您将需要虚拟继承,而这更难处理。然而,如果你的基类是纯抽象的,这应该不是问题。
你可能会看到这个。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- c++ 我需要在结构中存储具有继承和虚函数的各种类之间的对象"type"