当A(派生类)"是"B(基类)时,我们使用继承.A"可以"B或C时我们该怎么办?

Cis*_*ool 5 c++ oop inheritance

抱歉这个丑陋的问题,但我不知道如何说出来.我举一个例子来说明我的意思:

人类可以是法师或战士,因此法师和战士可以继承人类.但是,如果Orc也可以兼得并入呢?我们不能说"人类是战士"或"战士是人".Orc和Human(或父类,Humanoid)是否继承了所有技能,然后选择使用什么?

我不知道我是否应该标记一种特定的语言,因为这是关于oop的一般性问题,但由于不同的语言可以针对同一问题采用不同的方法,我更倾向于从C++的角度来回答.

kfm*_*e04 8

改善您的建模

  1. 抽象类种族,具体类人类,兽人等......
  2. 抽象类,具体类法师,战士,等等.

例如,在计算Mage的统计数据时,请询问Race(非Human或Orc)等int get_intelligence_bonus()(Race中的抽象函数).如果可能的话,应该在RaceClass之间进行交互,而不是具体的对应.

使用组合来实际构建你的角色:

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


Mik*_*one 5

那是我打破基于政策的设计的时候.然后我可以拥有Human<Warrior>Orc<Warrior>Orc<Mage>.(或者如果它更有意义就转过来:Warrior<Human>等等)但是如果我知道在编译时发生了什么,那就是这样.

如果我不知道,直到运行时,我会使用一个类Humanoid,其有一个 Race(子类是Orc,Human等),并有一个 RPGClass(子类Mage,Warrior等等)

在其他语言中,有些协议可以定义对象的接口,因此您不必定义充满抽象虚拟方法等的基类.所以RPGClass并且Race将是用于分别Mage与诸如和之类的类接口的协议Human.策略只是在编译时解决的协议.

PS我不知道你的例子是多么隐喻(或不是)......