如何组织多层类继承?求不覆写父类的方法扩展最优方案
优化扩展父类行为的实现方案
背景说明
- 语言特性:该语言支持类继承,若子类存在与父类同名的函数,子类实例调用该函数时父类对应函数完全不会执行。
- 核心需求:在不覆写父类核心方法的前提下,找到更简洁的扩展父类行为的方案,避免为每个可继承类添加冗余的空钩子函数(如当前实现中的
_doSomething_descendantOfFeline())。
当前冗余实现
Animal类代码
class_name Animal func _doSomething(): #do something common to "Animal" _doSomething_descendantOfAnimal() func _doSomething_descendantOfAnimal(): #no behaviour here, since it will be overridden by descendants
Feline类代码
class_name Feline extends Animal func _doSomething_descendantOfAnimal(): #behaviour common to "Feline" _doSomething_descendantOfFeline() func _doSomething_descendantOfFeline(): #no behaviour here
HouseCat类代码
class_name HouseCat extends Feline func _doSomething_descendantOfFeline(): #behaviour specific to "HouseCat"
当前方案通过层层定义空钩子实现行为叠加,但冗余的空函数增加了代码维护成本。
最优简化方案
你可以通过统一扩展方法+父类调用的方式,彻底消除空钩子函数:
改造后的Animal类
class_name Animal func _doSomething(): # Animal通用行为逻辑 _extend_doSomething() # 统一扩展入口,子类覆写时可选择调用父类实现 func _extend_doSomething(): # 默认无逻辑,子类按需扩展
改造后的Feline类
class_name Feline extends Animal func _extend_doSomething(): # Feline专属通用行为 super._extend_doSomething() # 可选:调用父类扩展逻辑,实现行为叠加
改造后的HouseCat类
class_name HouseCat extends Feline func _extend_doSomething(): # HouseCat专属行为 super._extend_doSomething() # 调用Feline的扩展逻辑,完成全链路行为叠加
方案优势
- 无需为每个继承层级定义专属空钩子,所有扩展逻辑收敛到单一方法
- 子类可灵活控制行为叠加:调用
super._extend_doSomething()则执行父类逻辑,不调用则仅执行自身逻辑 - 代码结构更简洁,新增子类时只需关注自身扩展逻辑,无需额外定义空方法
如果需要更复杂的行为组合,还可以考虑在父类核心方法中触发自定义事件,子类通过订阅事件注入扩展逻辑,但对于大多数继承场景,上述简化方案已经足够高效且易维护。
内容的提问来源于stack exchange,提问作者user289661
相关产品推荐
相关产品推荐

