我有下面的类层次结构:
class Human {
void foo()=0; //abstract
int age;
bool sex;
double size;
Human(int pAge,bool pSex,double pSize) : age(pAge), sex(pSex), size(pSize)
}
class MetaHuman : Human { //abstract
double power;
bool fly;
bool heal;
MetaHuman(int pAge,bool pSex,double pSize,double pPower,bool pFly,bool pHeal) : Human(...), power(pPower),fly(pFly),heal(pHeal) }
class SuperHuman : MetaHuman {
void foo() const {}; //non abstract
bool xray;
bool inspace;
double teleportation;
SuperHuman(int pAge,bool pSex,double pSize,double pPower,bool pFly,bool pHeal,bool pXray,bool pInspace,double pTeleportation) :
MetaHuman(...),xray(pXray),inspace(pInspace),teleportation(pTeleportation)
}
如您所见,我只是在每个派生类中向下重复基类构造函数的所有参数,并相对于派生类添加几个参数。
有什么方法/图案/设计可以避免必须重写所有内容?
对于严格的OOP,通常通过将参数封装在struct中来处理此类问题:
struct HumanData {
int pAge,
bool pSex,
double pSize,
double pPower,
bool pFly,
bool pHeal
}
或者,您可以构造以在MetaHuman基础上创建SuperHuman。
提示,正如我所见,您正在尝试一些游戏开发人员。通常将属性包装在结构中,“会收获很多”。因此,让您的性别成为基于布尔的枚举(我知道,有点过分杀人了:))。您可以在此处阅读有关C ++ 0x中的基类枚举的信息:http : //blog.smartbear.com/c-plus-plus/closer-to-perfection-get-to-know-c11-scoped-and-based-枚举类型/
您将获得超强类型的类数据,几乎不会影响性能。
附带说明:您是否绝对确定需要使您的类层次结构如此陡峭?正如Stroustrup所说:“不要立即为您所有的班级发明一个独特的基础。通常,如果没有很多/大多数班级,您可以做得更好。” -非常准确。
C ++不是C#/ Java-强制如此,只会使其反叛。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句