继承的友谊

inherited friendship

本文关键字:友谊 继承      更新时间:2023-10-16

现在,在你们开始愤怒之前,我来了。是的,我认识到它实际上是为了让友谊不被继承,我只是想找到一些类似的东西。这是我的情况(没有真正的代码,只有理论)。我正在开发一个简单的抽象游戏引擎框架,起初,我只是打算做一个简单的面向对象/继承方法来分解对象类型。现在,它在纸上听起来真的很好,把实体分解成物理、动画和不动的风景以及所有子类别的子类别。然而,这变成了一个危险的,难以处理完全不同的对象的混乱和相当多的危险转换,如果我错过了我需要强制执行的东西而不是编译器,这总是一个好兆头,表明有一个更好的解决方案。

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

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。

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

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

多年来

,我看到关于友谊及其如何影响封装有两种不同的观点:

  • 它通过不向所有人公开成员,并且仅使其可供受控实体子集访问来帮助改进封装。
  • 它减少了封装,因为显而易见的经典原因,即对象应该是自包含的,并且应该是修改其内部部分的唯一实体,等等。

我倾向于避免使用友谊,并试图绕过它。我更喜欢封装所有内容,不仅要使其私有,而且能够更改其内部实现方式而不会影响类的用户。 如果希望基类能够修改派生类的属性,也许可以考虑使用模板方法设计模式。基类在派生类上编排调用方法,并确保在基类中定义了泛型抽象操作方法。

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