`

万恶的继承

阅读更多

(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
分享到:
评论

相关推荐

    万恶之源2011VIP内部135

    【万恶之源2011VIP内部135】是一个特定版本的网络安全工具,由“万恶之源网安基地”站长开发。这个工具的名称中提到的“135抓鸡”,实际上指的是在网络安全领域中寻找并控制易受攻击的服务器或计算机的行为,这些...

    万恶的Blogbus教程免费版.rar

    这篇"万恶的Blogbus教程免费版"很可能是针对初学者或者那些希望深入理解Blogbus平台特性的用户设计的。从提供的文件列表来看,我们有以下三个文件: 1. **下载说明.txt** - 这个文件可能包含了下载教程的具体步骤,...

    万恶的反对风格如果我

    很抱歉,但根据您提供的信息,标题"万恶的反对风格如果我"和描述"斯蒂芬告诉对方告诉对方告诉对方告诉对方的方式告诉对方公司法"似乎与IT知识不直接相关,同时也无法明确地指向任何特定的技术主题。标签"法大赛官方...

    万恶的斐波那契.exe

    万恶的斐波那契.exe

    android去万恶的广告补丁

    "android去万恶的广告补丁"是一个针对这一问题的解决方案,旨在帮助用户去除应用程序中的广告,提升使用舒适度。这个补丁由开发者首次发布,表达了他们希望通过提供这种服务来获得用户的支持,并承诺未来会有更多...

    万恶的前端内存泄漏及万善的解决方案详解.docx

    前端内存泄漏及解决方案详解 在前端开发中,内存泄漏是一个非常重要的主题。内存泄漏是指系统进程不再使用的内存没有及时释放,导致内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。在本文中,我们将讨论...

    万恶的足球比赛.zip

    全国大学生电子设计竞赛(National Undergraduate Electronics Design Contest),试题,解决方案及源码。计划或参加电赛的同学可以用来学习提升和参考。程序均是实战案例,经过测试可直接运行。...

    万恶的凯撒加密1

    凯撒加密,又称为移位密码,是一种古老且基础的加密技术,源于古罗马时期的军事通信,用以保护敏感信息不被敌人截获。它的基本原理是将明文中的每个字母按照固定的距离在字母表上向前或向后移动,以此达到加密的效果...

    万恶的音乐符号1

    在音乐的世界里,符号是传达旋律、节奏和情感的关键元素。音乐符号的种类繁多,它们各有特定的含义,能够指示演奏者如何演绎乐曲。在这个故事中,超帆正面临一个挑战,他需要理解森森哼唱的一段曲子所包含的信息。...

    操作手册请勿而且万恶

    在当今快速变化的企业环境中,信息化已成为推动企业进步的关键力量。人力资源作为企业发展的核心资源,其管理方式的变革尤为重要。集团在追求人力资源信息化建设的过程中,深刻认识到这一点,并以此为出发点,致力于...

    我认为二位二万恶玩儿

    玩儿玩儿万恶人恶趣味而且维尔萨芬撒大幅撒大幅

    《万恶迷糊尤物》第三技:笑看混战人1000字.docx

    在《万恶迷糊尤物》这一小说中,作者通过一段段跌宕起伏的情节,向我们揭示了主角们之间复杂的人际关系与深层的个性描写。小说中的人物格湘和殷澈,他们之间的互动不仅仅局限于表面的嬉笑怒骂,更是彼此间深刻的保护...

    C#小技巧 万恶的10字

    ### C#小技巧详解 #### 一、颜色值转换技巧 在C#中,颜色值的处理是非常常见的需求之一,特别是在进行UI设计时。这里介绍一个实用的小技巧:如何将`System.Drawing.Color`结构体的颜色值转换为16进制字符串,并反...

    万恶的Appuse-----Appuse2.X在MyEclipse之中的部署问题

    【标题】:“万恶的Appuse-----Appuse2.X在MyEclipse之中的部署问题” 在探讨Appfuse 2.x在MyEclipse中的部署问题前,我们先来了解下Appfuse和MyEclipse这两个关键概念。 Appfuse是一个开源项目,它提供了一种快速...

    vs2003远程调试(万恶的CSDN)

    文件中是远程调试用到的文件,调试方法如下: 1. 拷贝《vs2003远程调试文件》文件夹到目标机器任意位置 2. 运行StartMsvcmon.bat批处理 3. 保证需要调试的进程已经启动,同时在执行文件下有相应的pdb文件 ...

    删除万恶的空格与tab.txt

    因为工作中有人喜欢在,前面加空格,还有人喜欢吧tab搞得到处都是,所以写了一个这个文件,用来删除行尾的tab与奇怪的空格

    SSM框架配置 底层配置万用模板(x)万恶之源(√)

    然而,如果配置过于通用,可能会带来问题,因为每个项目都有其特定的需求,过度模板化的配置可能会限制项目的灵活性,这可能是为什么描述中称其为“万恶之源”。 文件名为"meow",在上下文中可能表示这个压缩包里...

    VS2003远程调度工具(万恶的CSDN)

    文件中是远程调试用到的文件,调试方法如下: 1. 拷贝《vs2003远程调试文件》文件夹到目标机器任意位置 2. 运行StartMsvcmon.bat批处理 3. 保证需要调试的进程已经启动,同时在执行文件下有相应的pdb文件 ...

    Winodws平台C++共享内存实现(万恶的CSDN)

    在Windows平台上,C++共享内存是一种高效的进程间通信(IPC, Inter-Process Communication)方法,允许不同的进程访问同一块内存区域。本项目提供了一个已经封装为C++类的实现,使得服务端可以写入数据,而客户端则...

Global site tag (gtag.js) - Google Analytics