首页 > 社会 > 正文内容

子类重写方法时如何避免盖父类功能?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万利息");
    }
}

??关键点:??

  1. super必须放在子类方法第一行(像不像吃饭先叫长辈动筷子?)
  2. 构造方法中不写super(),Java会偷偷帮你调用无参构造
  3. ??别手贱写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个坑:??

  1. 多重继承时,super()按MRO顺序找爹(像查族谱找最近的长辈)
  2. Python3可以简写super(),但Python2必须写super(子类名,self)
  3. 混用两种方式会导致重复执行(比如例子里的攻击会打两次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种语言都适用)

  1. ??先继承再创新??:重写方法时,先把父类方法调用写了再添加新功能
  2. ??单元测试不能少??:跑个测试用例,看看父类功能是否健在
  3. ??别动父类私有方法??:就像不能随便拆老爸的私房钱信封(Java/Python的private方法禁止覆盖)
  4. ??文档注释要写明??:在子类方法头用@override标注(让队友知道这是改良版)

??个人观点时间??
用了这么多年继承,发现最稳妥的方式是:??把父类方法当基础设施??。就像改装汽车,你可以加氮气加速,但不能拆掉发动机。最近在写支付系统时,就因为某个子类没调用super.验签(),导致整个交易链路崩了——你看,基础功能就像房子的地基,动了就要塌房!

搜索