Pesan yang lewat adalah cara berbeda dalam menangani kebutuhan dalam kode OO untuk satu objek untuk mendapatkan objek lain (atau berpotensi sendiri) untuk melakukan sesuatu.
Dalam sebagian besar bahasa modern yang berasal dari pendekatan C ++ kami melakukannya dengan pemanggilan metode. Dalam hal ini objek yang dipanggil (melalui definisi kelasnya) menempatkan daftar besar apa yang diterima metode dan kemudian pembuat kode dari objek yang memanggil hanya menulis panggilan:
public void doSomething ( String input )
...
other_object.dosomething ( local )
Untuk bahasa yang diketik secara statis maka kompiler kemudian dapat memeriksa jenis hal yang dipanggil dan mengonfirmasi bahwa metode telah dideklarasikan. Untuk bahasa yang diketik secara dinamis maka itu dilakukan pada saat runtime.
Tetapi pada dasarnya yang terjadi adalah bahwa kumpulan variabel dikirim ke blok kode tertentu.
Pesan lewat
Dalam bahasa lewat pesan (seperti Objective C) bukan metode ada penerima, tetapi secara luas pendekatan mendefinisikan mereka dan memanggil mereka hampir sama - perbedaannya adalah cara penanganannya.
Dalam pesan yang lewat bahasa, kompiler dapat memeriksa apakah penerima yang Anda panggil ada, tetapi paling buruk itu akan memunculkan peringatan untuk mengatakan bahwa tidak ada di sana. Ini karena pada saat run time yang akan terjadi adalah bahwa suatu blok kode pada objek penerima akan dipanggil lewat bundel variabel dan tanda tangan penerima yang ingin Anda panggil. Blok kode itu kemudian mencari penerima dan memanggilnya. Namun jika penerima tidak ada maka kode hanya akan mengembalikan nilai default.
Akibatnya salah satu keanehan yang ditemukan ketika pindah dari C ++ / Java -> Objective C adalah memahami bahwa Anda dapat "memanggil metode" pada objek yang tidak dideklarasikan pada tipe waktu kompilasi, dan bahkan tidak ada pada jenis run-time ... dan bahwa panggilan tidak akan menghasilkan pengecualian yang dilemparkan tetapi pada kenyataannya hasil yang dikembalikan.
Keuntungan dari pendekatan ini adalah bahwa hal itu meratakan hirarki subclass dan menghindari sebagian besar kebutuhan untuk antarmuka / beberapa jenis warisan / bebek. Ini juga memungkinkan objek untuk mendefinisikan perilaku default ketika diminta untuk melakukan sesuatu yang mereka tidak punya penerima (biasanya "jika saya tidak melakukannya, teruskan permintaan ke objek lain ini"). Itu juga dapat menyederhanakan penautan ke callback (misalnya untuk elemen UI dan peristiwa dengan waktu tertentu) terutama pada bahasa yang diketik secara statis seperti Java (sehingga Anda dapat meminta tombol memanggil penerima "runTest" daripada memanggil metode "actionPerformed" pada kelas dalam) "RunTestButtonListener" yang melakukan panggilan untuk Anda).
Namun tampaknya akan menjadi biaya dari kebutuhan untuk pemeriksaan tambahan oleh pengembang bahwa panggilan yang mereka pikir mereka lakukan adalah pada objek yang tepat dengan tipe yang tepat dan melewati parameter yang tepat dalam urutan yang benar, karena kompiler mungkin tidak memperingatkan Anda dan itu akan berjalan dengan baik saat runtime (hanya mengembalikan respons default). Ada juga bisa dibilang hit kinerja dari pencarian ekstra dan melewati paramter.
Saat ini, bahasa yang diketik secara dinamis dapat memberikan banyak manfaat dari pesan yang lulus OO dengan lebih sedikit masalah.