现在在你们开始肆虐之前,我在这里。是的,我认识到它实际上是为了让友谊不被继承,我只是想找到一些方法来获得类似的东西。这是我的情况(没有真正的代码,只有理论)。我正在研究一个简单的抽象游戏引擎框架,起初,我只是要做一个简单的面向对象/继承方法来打破对象类型。现在,它在纸上听起来非常不错,将实体分解为物理,动画和不动的风景以及所有子类别的子类别。然而,这成了一个危险的,难以处理完全不同的对象的混乱和相当多的危险的铸造,如果我错过了我需要执行的东西而不是编译器,这很容易导致问题,这总是一个好的迹象,那里是一个更好的解决方案。
所以,我提出了一种抽象表示对象的不同方法。我希望有一个实体类,所有实体派生自哪个实体类包含一个向量,或者其他一些运行最佳的动态可增长数组,它将包含我称之为行为的对象。行为将在指定的时间后更新,这将影响指定对象的成员。以下是一些例子。
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。
顺便说一下,通过友谊,我的意思是基类行为与一些衍生实体类相关联,这可以影响它的私有成员。例如,假设我有一个派生自实体的模型类,我想知道一个派生类的行为,称为动画,然后由于某种原因从模型派生出一个类到更具体的对象类型,怎么能动画对象操纵这个新模型派生对象的私有成员。还是可以吗?关于这种方法可行的可行性的意见也是受欢迎的(只要它们实际上包含批评)。
答案 0 :(得分:2)
多年来我看到友谊有两种不同的观点,以及它如何影响封装:
我倾向于避免使用友谊并尝试解决它。我更喜欢封装所有内容,不仅仅是为了使其成为私有,而是能够在不影响类用户的情况下更改其内部实现方式。如果您希望基类能够修改派生类的属性,也许您可以考虑使用Template Method设计模式。因此,基类在派生类上编排调用方法,并确保在基类中定义通用的抽象操作方法。
至于将一个类的所有属性公开“以防万一”,(听起来非常危险)我认为最好将它们全部私有化,并考虑在需要时公开个别属性。< / p>