Rumah > Java > javaTutorial > Memahami Double Dispatch: Panduan Mudah

Memahami Double Dispatch: Panduan Mudah

Susan Sarandon
Lepaskan: 2024-11-12 15:44:02
asal
715 orang telah melayarinya

Understanding Double Dispatch: A Simple Guide

Baiklah, rakan pengekod, mari kita bincangkan tentang penghantaran berganda — konsep yang kelihatan lebih menarik daripada yang sebenarnya. Tetapi percayalah, sebaik sahaja anda memahaminya, anda akan menyedari ia hanyalah helah yang kemas untuk mengendalikan objek daripada dua jenis yang berbeza. Dan inilah penyepaknya: penghantaran berganda sebenarnya adalah satu bentuk penghantaran berbilang, yang kedengarannya lebih sejuk daripada sebelumnya. Tetapi jangan risau, saya akan menguraikannya dengan baik dan ringkas untuk anda!


Apakah itu Runtime Dispatch?
Dalam pengaturcaraan berorientasikan objek, penghantaran ialah proses memikirkan kaedah mana yang perlu dipanggil apabila kami menjalankan program. Bayangkan anda mempunyai kaedah yang dipanggil makeSound() dalam kelas haiwan yang berbeza, seperti Anjing dan Kucing. Apabila anda memanggil makeSound() pada objek haiwan, penghantaran memutuskan sama ada anda mendapat "kulit kayu" atau "meow" pada masa tayangan, bergantung pada sama ada objek itu Anjing atau Kucing.

Penghantaran masa jalan secara khusus bermaksud bahawa pembuatan keputusan ini berlaku semasa program sedang berjalan, berbanding penghantaran masa kompilasi (apabila pengkompil membuat keputusan semasa penyusunan kod). Kebanyakan bahasa berorientasikan objek menyokong penghantaran tunggal (aka Method Overriding), tetapi bahasa lain seperti Julia membawanya lebih jauh dengan berbilang penghantaran. Satu perkara yang perlu diberi perhatian ialah penghantaran bukan hanya mengenai masa jalan. Sesetengah penghantaran berlaku dalam masa penyusunan seperti kaedah terlebih muatan. Perkara yang akan kita bincangkan ialah sesuatu yang berlaku semasa masa jalan.

Bagaimana Double Dispatch Berfungsi?
Penghantaran berganda adalah seperti tarian dua langkah. Begini caranya: kaedah dipanggil berdasarkan jenis objek pertama, dan kemudian di dalam kaedah itu, kaedah lain dipanggil berdasarkan objek kedua. Jadi, dua objek, dua hantaran.

Mari bayangkan anda sedang menulis program yang anda mempunyai bentuk (seperti Bulatan dan Segiempat) dan warna (seperti Merah dan Biru). Anda ingin menggunakan warna pada bentuk, tetapi tingkah laku harus bergantung pada kedua-dua bentuk dan warna. Di situlah penghantaran berganda masuk!

Contoh Kod dalam Java
Biar saya tunjukkan cara ini berfungsi dengan beberapa kod Java:

class Circle {
    public void changeColor(Color color) {
        color.applyToCircle(this);
    }
}

class Square {
    public void changeColor(Color color) {
        color.applyToSquare(this);
    }
}

interface Color {
    void applyToCircle(Circle circle);
    void applyToSquare(Square square);
}

class Red implements Color {
    public void applyToCircle(Circle circle) {
        System.out.println("Coloring circle red");
    }

    public void applyToSquare(Square square) {
        System.out.println("Coloring square red");
    }
}

class Blue implements Color {
    public void applyToCircle(Circle circle) {
        System.out.println("Coloring circle blue");
    }

    public void applyToSquare(Square square) {
        System.out.println("Coloring square blue");
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle();
        Square square = new Square();
        Red red = new Red();
        Blue blue = new Blue();

        // First dispatch: the object calling the method
        circle.changeColor(red);   // Output: Coloring circle red
        square.changeColor(blue);  // Output: Coloring square blue
    }
}

Salin selepas log masuk

Apa Yang Berlaku Di Sini?

Penghantaran pertama: Apabila anda memanggil circle.changeColor(red), Java melihat jenis bulatan (iaitu Bulatan) dan memanggil kaedah changeColor padanya. Itulah penghantaran pertama anda.
Penghantaran kedua: Di dalam kaedah changeColor, kami memanggil kaedah applyToCircle pada objek merah. Itu adalah penghantaran kedua, dan ia ditentukan oleh jenis merah.
Kenapa Double Dispatch Berguna?
Jadi mengapa anda perlu mengambil berat tentang perkara penghantaran berganda ini? Nah, ini sangat membantu apabila anda perlu membuat keputusan berdasarkan jenis kedua-dua objek yang terlibat dalam operasi. Dan rasa apa? Anda tidak perlu menukar mana-mana kelas sedia ada anda jika anda ingin menambah lebih banyak bentuk atau lebih banyak warna. Anda hanya menambah lebih banyak kaedah untuk mengendalikan kombinasi baharu! Penghantaran berganda juga berguna jika anda ingin memahami dan menggunakan corak reka bentuk seperti corak reka bentuk Pelawat.

Dalam istilah yang lebih ringkas, penghantaran berganda membolehkan anda melakukan perkara yang menarik tanpa merosakkan kod sedia ada anda. Ia seperti menambah topping baharu pada piza anda tanpa membuang keraknya.


Penghantaran berganda adalah mengenai membuat panggilan kaedah yang bergantung pada dua jenis objek yang berbeza, dan ia amat berguna untuk senario di mana objek perlu berinteraksi dengan cara yang berbeza. Bahagian yang menyeronokkan ialah ia tidak terhad kepada satu objek sahaja — kedua-duanya terlibat dalam proses membuat keputusan. Ini menjadikan penghantaran berganda alat yang hebat untuk sistem yang fleksibel dan boleh diperluaskan.

Sekarang, pergi ke sana dan mula menggunakan penghantaran berganda untuk menjadikan kod anda lebih berkuasa. Selamat mengekod! ?

Atas ialah kandungan terperinci Memahami Double Dispatch: Panduan Mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan