İleti iletme, bir nesnenin başka bir nesneyi (veya potansiyel olarak kendisinin) bir şeyi yapması için OO kodundaki ihtiyacı ele almanın farklı bir yoludur.
C ++ yaklaşımından çıkan çoğu modern dilde bunu metod çağrıları ile yapıyoruz. Bu durumda, çağrılan nesne (sınıf tanımı aracılığıyla), kabul ettiği yöntemin kabul ettiği yöntemlerin büyük bir listesini koyar ve ardından arayan nesnenin kodlayıcısı çağrıyı yalnızca yazar:
public void doSomething ( String input )
...
other_object.dosomething ( local )
Statik olarak yazılmış diller için derleyici daha sonra çağrılan şeyin türünü kontrol edebilir ve yöntemin bildirildiğini onaylayabilir. Dinamik olarak yazılmış diller için o zaman çalışma zamanında gerçekleştirilir.
Fakat özünde olan şey, bir paket değişkeninin belirli bir kod bloğuna gönderildiğidir.
İleti geçişi
Mesaj yerine geçen dillerde (örneğin, C nesnesindeki gibi) yöntemler yerine alıcılar vardır, fakat genel olarak onları tanımlama ve onları çağırma yaklaşımı aynıdır - fark, işlenme şeklidir.
Bir mesajın geçtiği dilde, derleyici aradığınız alıcının var olup olmadığını kontrol edebilir , ama en kötüsü orada olduğundan emin olmadığını söylemek için bir uyarı çıkarır. Bunun nedeni, çalışma zamanında gerçekleşecek olan şey, alıcı değişken üzerindeki bir kod bloğunun hem değişken paketini hem de aramak istediğiniz alıcının imzasını geçerek çağrılmasıdır. Bu kod bloğu daha sonra alıcıyı arar ve onu çağırır. Ancak alıcı yoksa, kod basitçe varsayılan bir değer döndürür.
Sonuç olarak, C ++ / Java -> Objective C konumundan taşınırken ortaya çıkan tuhaflıklardan biri, derleme zamanı türünde bildirilmemiş ve üzerinde bulunmayan bir nesnede "yöntem çağırabileceğinizi" anlamaktır. çalışma zamanı türü ... ve çağrının bir istisna atılmasına neden olamayacağı, gerçekte bir sonucun geri alınacağı sonucuna varır.
Bu yaklaşımın avantajları, alt sınıf sıradüzenini düzleştirmesi ve arayüzler / çoklu kalıtım / ördek türleri için ihtiyaçların çoğundan kaçınmasıdır. Ayrıca, alıcıları olmayan bir şey yapmaları istendiğinde nesnelerin varsayılan davranışı tanımlamasına olanak tanır (genellikle "yapmazsam, isteği bu diğer nesneye ilet"). Ayrıca, özellikle Java gibi statik olarak yazılmış diller üzerinden geri aramalara (örneğin, UI öğeleri ve zamanlanmış olaylar için) bağlantı yapılmasını basitleştirebilir (böylece, düğmeye, iç sınıftaki "actionPerformed" yöntemini çağırmak yerine "runTest" alıcısını çağırma şansı verebilir. "RunTestButtonListener" sizin için arama yapar).
Bununla birlikte, geliştirici tarafından yaptıkları çağrının doğru tipte ve doğru parametreleri doğru sırayla geçirerek doğru nesne üzerinde olduğunu ve ek parametreleri doğru sırayla geçirdiğini düşündüğü için ek kontrol gereksinimine mal olacak gibi görünmektedir. sizi uyarır ve çalışma zamanında mükemmel çalışır (sadece varsayılan bir cevap döndürür). Muhtemelen, ekstra görünüm ve paramter geçişinden elde edilen bir performans vuruşu da var.
Bu gün, dinamik olarak yazılmış diller, daha az sorunla OO’dan geçen mesajın birçok faydasını sağlayabilir.