Rumah >Java >javaTutorial >Mengapa Java Melarang Memanggil Kaedah Superclass Superclass (super.super.method())?

Mengapa Java Melarang Memanggil Kaedah Superclass Superclass (super.super.method())?

DDD
DDDasal
2024-12-31 13:25:17522semak imbas

Why Does Java Prohibit Calling a Superclass's Superclass Method (super.super.method())?

Memanggil Kaedah Super Super di Java: Mengapakah Ia Dilarang?

Walaupun mudah untuk mengelakkan senario tertentu dengan mengakses ibu bapa kaedah induk secara langsung menggunakan super.super.method(), Java melarang seruan tersebut. Artikel ini meneroka sebab di sebalik sekatan ini dan membincangkan sama ada mekanisme analog wujud dalam bahasa lain.

Pelanggaran Enkapsulasi

Sebab utama Java tidak membenarkan super.super.method() adalah untuk menegakkan enkapsulasi. Prinsip ini menghalang pintasan gelagat kelas induk dengan mengakses superclassnya secara langsung. Walaupun memintas tingkah laku kelas sendiri kadangkala diperlukan, seperti dari dalam kaedah yang sama, subkelas tidak sepatutnya memintas tingkah laku ibu bapa mereka.

Contoh: Mengekalkan Invarian Kelas

Pertimbangkan hierarki kelas: Item, RedItems dan BigRedItems. Item mewakili koleksi item, RedItems koleksi item merah dan BigRedItems koleksi item merah besar. Untuk mengekalkan integriti setiap kelas:

public class Items {
    public void add(Item item) { ... }
}

public class RedItems extends Items {
    @Override
    public void add(Item item) {
        if (!item.isRed()) {
            throw new NotRedItemException();
        }
        super.add(item);
    }
}

public class BigRedItems extends RedItems {
    @Override
    public void add(Item item) {
        if (!item.isBig()) {
            throw new NotBigItemException();
        }
        super.add(item);
    }
}

Ini memastikan RedItems mengandungi hanya item merah dan BigRedItems hanya mengandungi item merah besar.

Melanggar Kontrak Enkapsulasi

Jika super.super.add() adalah dibenarkan:

public class NaughtyItems extends RedItems {
    @Override
    public void add(Item item) {
        // Add any item to NaughtyItems, ignoring the rule in RedItems
        super.super.add(item);
    }
}

NaughtyItems boleh memintas invarian dalam RedItems, menambahkan item secara sembarangan, menjadikan enkapsulasi RedItems tidak bermakna.

Kesimpulan

larangan super.super.method() di Jawa adalah perlindungan penting yang menghalang pelanggaran enkapsulasi, mengekalkan integriti dan ketekalan hierarki kelas. Walaupun ia mungkin menghalang senario mudah tertentu, ia memastikan keteguhan dan kebolehpercayaan pangkalan kod Java.

Atas ialah kandungan terperinci Mengapa Java Melarang Memanggil Kaedah Superclass Superclass (super.super.method())?. 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