`

万恶的继承

阅读更多

(1)

关于人物继承:
class attribute;
class fight:attribute;
class mrole:fight
class 怪物:fight

    其中人物和怪物继承的属性一样。在一次扩充中,需要加入根据属性点来提升攻击效果比例的各种药剂。而一些攻击函数的触发都放在fight类里。这也是无可非议的。 但是怎样才能让这些函数知道人物的药剂状态呢?我给fight类里加了个药剂状态的指示,先在mrole里根据效果指定好fight类里的指示,然后这些攻击函数再根据这些药剂状态进行做相应的不同动作。我起码做了以下这些复杂的动作(一切都是为了另一个怪物类的兼容)

1.给fight类加了映射mrole的药剂状态,并且赋予初始值。在一些公式里加了许多默认值。比如一些提升1.3倍效果的,默认为1.0倍
2.在一些旧代码奇怪的地方加了默认的参数.这个是旧代码的遗祸
3.在fight类里还要判断是否是哪个对象(其实这步完全不必要,因为有默认值了。)

 

    除了一些代码兼容的繁杂调试,一切还算顺利。但是问题出来了。一些怪物类明显增加了许多浮点的计算,先不去计较这些性能的损失,这两个明显是不相关的东西。不应该放在一起继承。而我更认为,继承更适合用在一些最原始的功能组合上,而且该功能不能太随意的扩充,尤其是你认为一些共有的抽象上。    比如这些怪物和人的继承,其实很多人想当然的认为怪物的存在形式都是根据人的存在形式脱变的,比如行走吃饭交谈。这在满足这些人的YY同时,这种奇怪的怪物也确实被制造出来了,然后安静的呆在一旁。因为计算机操纵的怪物永远不会向你提出"哦,我需要这些额外的东西"。而玩家们总是唧唧喳喳的需要各种请求。所以,在为地球上的生物进行划分关系时,先从科学家弄清楚他们是哺乳动物?猫科动物?。。。从来没资料说过怪物和人物是一个系列的,这简直是妖人
    因此在下个版本计划中,我可以先划分好怪物的科系属性,比如猫科,飞行科等等。。。如果有玩家愿意的话,再加个人妖系属性

 

 

(2)
class attribute; GetMaxLife()
class fight:attribute;
class mrole:fight
class 怪物:fight

    因为要有一个药剂涉及对生命的修改。要对GetMaxLife()中的内容代入一个权值。跟前几个不同,前几个是GetMaxLife()*权值。考虑到该函数出现了几十次,代入一个权值明显不合适。而且在Get的函数中,最终都是一个代入索引的循环取值。持续代入2个以上就开始影响到其他权值的修改。再给attribute设置一个映射fight中的药剂权值表吗?观察后发现初始化非常复杂。主程给了个方案:把GetMaxLife改成虚函数。然后修改原来调用该函数的名字(原来是inline,保持不变)。在fight中重写该函数,原来的接口全部改为调用新的重新函数。
    今日打算按虚函数的方式改写,结果发现调用GetMaxLife有的是GetA()->GetMaxLife,有的是 var a = GetA(), a->GetMaxLife().痛苦不已,下午又临时进行公式的校验。痛啊,要是把这些计算东西都放在一个层面多好。

 

 

(3)

另补充

对于这种继承上的设计,如果是属性和方法的关系比较紧密,变化也比较大,强烈建议分开。比如一个攻击函数,怪可能算完就完了,人还要考虑各种情况。当然这可以设计成虚拟函数,但随着这种变化的多元,不可能把每个函数都设计成虚拟的,那样除了给自己看没什么意义。而且这种继承的设计经常带给人以懒惰感。比如同个函数,可能两个不同继承体之间只有一个地方不一样,懒惰的做法就是,直接加个类型判断完事了。 随着这种曲线的增加,你的代码必定有一天破灭。而且维护的时候也是相当的噩梦

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics