
嘻道奇闻
- 文章199742
- 阅读14625734
子类重写方法时如何避免盖父类功能?3种语言代码示例
社会2025-06-02 22:15:19
??你写的代码怎么老是把父类搞崩???
新手写继承代码时,最怕的就是子类方法把父类功能覆盖了。今天咱们用Java、Python、PHP三种语言,聊聊怎么用??super关键字??和??显式调用??来避免这个坑。
一、为什么要保留父类功能?
举个现实例子:你继承了你爸的银行卡,改密码时不能把卡里的钱吞了吧?代码同理,??子类重写方法必须保留父类核心能力??。网页3提到,Java中如果子类构造方法不调用super(),程序直接报错,这就是强制保留父类能力的典型机制。
二、Java的正确姿势:super当开路先锋
java复制class 老豆 { void 转账() { System.out.println("转出100万"); } } class 儿子 extends 老豆 { @Override void 转账() { super.转账(); // 先让老爸转钱 System.out.println("再转50万利息"); } }
??关键点:??
- super必须放在子类方法第一行(像不像吃饭先叫长辈动筷子?)
- 构造方法中不写super(),Java会偷偷帮你调用无参构造
- ??别手贱写super.super??——Java禁止跨代调用(爷爷的方法得让爸爸来继承)
三、Python的灵活玩法:两种调用方式
网页9的代码展示了Python的骚操作:既可以用super()
,也能直接用父类名。比如开发游戏时:
python复制class NPC: def 攻击(self): print("平A伤害10点") class BOSS(NPC): def 攻击(self): NPC.攻击(self) # 方式1:直接点名 super().攻击() # 方式2:自动找爹 print("追加火焰伤害50点")
??注意这3个坑:??
- 多重继承时,super()按MRO顺序找爹(像查族谱找最近的长辈)
- Python3可以简写super(),但Python2必须写super(子类名,self)
- 混用两种方式会导致重复执行(比如例子里的攻击会打两次10点伤害!)
四、PHP的特殊设定:parent::大法
虽然用户主要问Java/Python,但网页11提到的PHP方案值得对比:
php复制class 老爹 { public function 做饭() { echo "煮了锅夹生饭"; } } class 闺女 extends 老爹 { public function 做饭() { parent::做饭(); echo "回锅炒成蛋炒饭"; } }
??有趣现象:??
- PHP用
parent::
代替super(像在说"这是我爸教我的") - 和Java不同,parent调用可以放在方法任意位置(自由但容易出错)
- 构造方法必须显式调用parent::__construct()(和Java反着来)
五、通用防坑指南(3种语言都适用)
- ??先继承再创新??:重写方法时,先把父类方法调用写了再添加新功能
- ??单元测试不能少??:跑个测试用例,看看父类功能是否健在
- ??别动父类私有方法??:就像不能随便拆老爸的私房钱信封(Java/Python的private方法禁止覆盖)
- ??文档注释要写明??:在子类方法头用@override标注(让队友知道这是改良版)
??个人观点时间??
用了这么多年继承,发现最稳妥的方式是:??把父类方法当基础设施??。就像改装汽车,你可以加氮气加速,但不能拆掉发动机。最近在写支付系统时,就因为某个子类没调用super.验签(),导致整个交易链路崩了——你看,基础功能就像房子的地基,动了就要塌房!