Cis*_*ool 5 c++ oop inheritance
抱歉这个丑陋的问题,但我不知道如何说出来.我举一个例子来说明我的意思:
人类可以是法师或战士,因此法师和战士可以继承人类.但是,如果Orc也可以兼得并入呢?我们不能说"人类是战士"或"战士是人".Orc和Human(或父类,Humanoid)是否继承了所有技能,然后选择使用什么?
我不知道我是否应该标记一种特定的语言,因为这是关于oop的一般性问题,但由于不同的语言可以针对同一问题采用不同的方法,我更倾向于从C++的角度来回答.
改善您的建模
例如,在计算Mage的统计数据时,请询问Race(非Human或Orc)等int get_intelligence_bonus()(Race中的抽象函数).如果可能的话,应该在Race和Class之间进行交互,而不是具体的对应.
使用组合来实际构建你的角色:
Character::Character( std::unique_ptr<Race> r, std::unique_ptr<Class> c )
{
// calculate stats, etc...
}
Run Code Online (Sandbox Code Playgroud)
您可以使用纯OOP进行动态绑定,或者如果您愿意,可以使用模板进行静态时间绑定,但这是一个正交实现问题.无论哪种方式,您都需要使您的类层次结构正确.
如果您是C++的新手,或者如果您只需要构造函数中的种族和类,则可以使用const&而不是std::unique_ptr<>.但是,如果您认真学习C++,请阅读有关所有权语义和可变生命周期的内容,以便您更好地理解std::unique_ptr<>.
http://en.cppreference.com/w/cpp/memory/unique_ptr
那是我打破基于政策的设计的时候.然后我可以拥有Human<Warrior>或Orc<Warrior>或Orc<Mage>.(或者如果它更有意义就转过来:Warrior<Human>等等)但是如果我知道在编译时发生了什么,那就是这样.
如果我不知道,直到运行时,我会使用一个类Humanoid,其有一个 Race(子类是Orc,Human等),并有一个 RPGClass(子类Mage,Warrior等等)
在其他语言中,有些协议可以定义对象的接口,因此您不必定义充满抽象虚拟方法等的基类.所以RPGClass并且Race将是用于分别Mage与诸如和之类的类接口的协议Human.策略只是在编译时解决的协议.
PS我不知道你的例子是多么隐喻(或不是)......