2

现在,在你们开始肆虐之前,让我出来。是的,我承认它实际上是为了友谊而不是继承,我只是想找到一些方法来获得类似的东西。这是我的情况(没有真正的代码,只是理论)。我正在研究一个简单的抽象游戏引擎框架,起初,我只是要做简单的面向对象/继承方法来分解对象类型。现在,它在纸面上听起来非常好,将实体分解为物理、动画和不动的场景及其所有子类别的子类别。然而,这变成了一个危险的,难以处理完全不同的对象的混乱和相当多的危险转换,如果我错过了我需要强制执行而不是编译器的东西,很容易导致问题,

因此,我提出了一种抽象表示对象的不同方法。我希望有一个实体类,所有实体派生自该实体类都包含一个向量,或者其他一些效果最好的动态可增长数组,它将包含我称之为行为的对象。行为将在指定的时间后更新,这将影响指定对象的成员。这里有些例子。

class Force : behavior;               
/*this would be a force, added to the behavior list and apply a constant 
acceleration vector to the object until removed from the behavior list. (or
it's lifetime is exhausted) */

class attackThought : behavior;  
/* For an ai, this would change how it reacts to a scenario by replacing or
even adding actions that it should perform given the change in position
or environment at update.*/

class animation : behavior;
/* You could create an animation, specify the animation that it is to perform, 
add it to the behavior list, and during the time update, it will adjust the 
vertex buffer accordingly, removing itself from the list when the animation
is done */ 

问题是,我想从一个基行为类派生,它以不同的方式实现它的一些虚函数,这些虚函数将主要更改实体对象的私有成员(例如对象顶点缓冲区)。我不想操作太多的基本实体代码,以便(在大多数情况下)可以与其他对象类似地对待,我只希望它们的行为完全可操作/可导出。任何人都可以想办法让这个系统在 C++ 中工作,因为我认为它可能真的很酷:P。

顺便说一句,通过友谊,我的意思是基类行为与一些派生实体类交朋友,这可以影响它的私有成员。例如,假设我有一个派生自实体的模型类,并且我想与一个名为动画的派生行为类交朋友,然后由于某种原因从模型派生一个类到更具体类型的对象,如何动画对象操纵这个新模型派生对象的私有成员。

或者可以吗?也欢迎就这种方法的可行性提出意见(只要它们实际上包含批评)。

4

1 回答 1

2

多年来,我已经看到关于友谊以及它如何影响封装有两种不同的观点:

  • 它通过不将成员公开给所有人,而只让受控的实体子集访问它们来帮助改进封装。
  • 由于对象应该是自包含的并且应该是修改其内部部分的唯一实体等明显的经典原因,它减少了封装。

我倾向于避免使用友谊并尝试解决它。我更喜欢封装所有内容,不仅仅是为了使其私有化,而是为了能够在不影响类用户的情况下更改其内部实现方式。如果您希望基类能够修改派生类的属性,也许您可​​以考虑使用模板方法设计模式。基类在派生类上协调调用方法,并确保在基类中定义了通用的抽象操作方法。

至于将类的所有属性都公开“以防万一”,(听起来很危险)我认为最好先将它们全部设为私有,并在需要时考虑将个别属性公开。

于 2012-05-29T07:37:27.923 回答