Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perkara yang perlu dipertimbangkan apabila mengatasi fungsi: Mengelakkan ranjau warisan

Perkara yang perlu dipertimbangkan apabila mengatasi fungsi: Mengelakkan ranjau warisan

WBOY
WBOYasal
2024-05-02 14:09:021047semak imbas

Lima langkah berjaga-jaga perlu dipatuhi semasa menulis semula fungsi: 1. Pastikan parameter dan jenis pemulangan konsisten 2. Gunakan anotasi @Override;

Perkara yang perlu dipertimbangkan apabila mengatasi fungsi: Mengelakkan ranjau warisan

Nota tentang fungsi mengatasi: Mengelakkan perangkap dalam warisan

Dalam pengaturcaraan berorientasikan objek, fungsi overriding ialah teknik utama yang membolehkan subkelas mengubah suai gelagat kaedah dalam kelas induk. Walau bagaimanapun, apabila menulis semula fungsi, penjagaan mesti diambil untuk mengelakkan kemungkinan perangkap.

1 Pastikan parameter dan jenis pulangan adalah konsisten

Fungsi yang ditulis semula mesti mempunyai parameter dan jenis pulangan yang sama seperti kaedah kelas induk. Sebarang perubahan akan menyebabkan ralat masa kompilasi atau pengecualian masa jalan.

Contoh kod Java:

class Parent {
    int add(int a, int b) { ... }
}

class Child extends Parent {
    // 重写 add 方法,但修改了参数类型
    int add(float a, float b) { ... } // 编译错误
}

2. Gunakan anotasi @Override

Apabila menulis semula fungsi, adalah disyorkan untuk menggunakan anotasi @Override. Ia memastikan bahawa anda mengatasi kaedah kelas induk dan tidak mencipta kaedah baharu secara tidak sengaja. @Override 注解。它可以确保你正在重写父类的方法,而不是意外地创建了新方法。

Java 代码示例:

class Child extends Parent {
    @Override
    int add(int a, int b) { ... }
}

3. 避免覆盖 final 方法

final 方法不能被重写。尝试这样做会导致编译时错误。

Java 代码示例:

class Parent {
    final int add(int a, int b) { ... }
}

class Child extends Parent {
    // 尝试重写 final 的 add 方法
    int add(int a, int b) { ... } // 编译错误
}

4. 谨慎处理访问权限

子类重写的方法的访问权限不能比父类方法的访问权限更严格。

Java 代码示例:

class Parent {
    protected int add(int a, int b) { ... }
}

class Child extends Parent {
    // 尝试将访问权限收紧为 private
    private int add(int a, int b) { ... } // 编译错误
}

5. 测试和理解父类方法

在重写函数之前,请仔细测试和理解父类方法的预期行为。重写后的方法应该提供与父类方法相同或更大的功能。

实战案例

考虑一个 Vehicle 基类及其子类 CarBikeVehicle 类有一个 start() 方法,用于启动车辆。

Vehicle.java

class Vehicle {
    public void start() {
        System.out.println("Vehicle started.");
    }
}

Car.java

class Car extends Vehicle {
    @Override
    public void start() {
        System.out.println("Car engine started.");
        super.start(); // 调用父类方法以启动常规车辆功能
    }
}

Bike.java

class Bike extends Vehicle {
    @Override
    public void start() {
        System.out.println("Bike pedaling started.");
    }
}

在这个例子中,Car 重写 start() 方法以添加特定的启动引擎代码,而 Bike 重写 start()

🎜Contoh kod Java: 🎜🎜rrreee🎜🎜3 Elakkan mengatasi kaedah akhir🎜🎜🎜 kaedahakhir tidak boleh ditindih. Percubaan untuk melakukan ini akan mengakibatkan ralat masa kompilasi. 🎜🎜🎜Contoh kod Java: 🎜🎜rrreee🎜🎜4. Kendalikan kebenaran akses dengan berhati-hati🎜🎜🎜Kebenaran akses kaedah yang ditindih oleh subkelas tidak boleh lebih ketat daripada kebenaran akses kaedah kelas induk. 🎜🎜🎜Contoh kod Java: 🎜🎜rrreee🎜🎜5. Uji dan fahami kaedah kelas induk🎜🎜🎜Sebelum mengatasi fungsi, uji dan fahami kelakuan yang dijangkakan kaedah kelas induk. Kaedah yang diganti harus menyediakan kefungsian yang sama atau lebih besar seperti kaedah kelas induk. 🎜🎜🎜Kes Praktikal🎜🎜🎜Pertimbangkan kelas asas Kenderaan dan subkelasnya Kereta dan Bike. Kelas Kenderaan mempunyai kaedah start() untuk menghidupkan kenderaan. 🎜🎜🎜Vehicle.java🎜🎜rrreee🎜🎜Car.java🎜🎜rrreee🎜🎜Bike.java🎜🎜rrreee🎜Dalam contoh ini, Kereta mengatasi kaedah >start untuk menambah kod enjin permulaan tertentu, manakala Bike mengatasi kaedah start() untuk menyediakan gelagat permulaan yang berkaitan dengan pedal. Dengan mengatasi fungsi dengan betul, subkelas boleh menyesuaikan kaedah kelas induk untuk memenuhi keperluan khususnya. 🎜

Atas ialah kandungan terperinci Perkara yang perlu dipertimbangkan apabila mengatasi fungsi: Mengelakkan ranjau warisan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn