Ad hoc polimorfizm - Ad hoc polymorphism

İçinde Programlama dilleri, ad hoc polimorfizm[1] bir çeşit çok biçimlilik Polimorfik fonksiyonların farklı tipteki argümanlara uygulanabildiği, çünkü bir polimorfik fonksiyon, uygulandığı argüman (lar) ın tipine bağlı olarak bir dizi farklı ve potansiyel olarak heterojen uygulamayı gösterebilir. Nesneye yönelik veya prosedürel kavramlara uygulandığında, aynı zamanda fonksiyon aşırı yükleme veya operatör aşırı yükleme. Dönem özel bu bağlamda aşağılayıcı olması amaçlanmamıştır; basitçe, bu tür bir polimorfizmin temel bir özelliği olmadığı gerçeğine atıfta bulunur. tip sistemi. Bu, zıttır parametrik polimorfizm, polimorfik fonksiyonların herhangi bir spesifik tipten bahsedilmeden yazıldığı ve böylece tek bir soyut uygulamayı herhangi bir sayıdaki türe şeffaf bir şekilde uygulayabildiği. Bu sınıflandırma, Christopher Strachey 1967'de.

Erken bağlama

Ad hoc polimorfizm bir sevk etmek mekanizma: adlandırılmış bir işlevde hareket eden kontrol, çağrılan tam işlevi belirtmek zorunda kalmadan çeşitli diğer işlevlere gönderilir. Aşırı yükleme, farklı türler alan birden çok işlevin aynı adla tanımlanmasına izin verir; derleyici veya çevirmen otomatik olarak doğru işlevin çağrılmasını sağlar. Bu şekilde, tamsayı listeleri, dizge listeleri, gerçek sayı listeleri vb. Ekleyen işlevler yazılabilir ve hepsi çağrılabilir. eklemek- ve sağ eklemek işlev, eklenen listelerin türüne göre çağrılır. Bu, fonksiyonun yazılması gereken parametrik polimorfizmden farklıdır. genel olarak, her türlü liste ile çalışmak için. Aşırı yükleme kullanarak, bir işlevin kendisine iletilen girdinin türüne bağlı olarak tamamen farklı iki şeyi gerçekleştirmesi mümkündür; parametrik polimorfizm ile bu mümkün değildir. Aşırı yüklemeye bakmanın bir başka yolu da, bir rutinin benzersiz bir şekilde adıyla değil, adı ve parametrelerinin sayısı, sırası ve türlerinin birleşimiyle tanımlanmasıdır.

Bu tür polimorfizm, nesne yönelimli programlama çoğu izin veren diller operatörler işlevlere benzer bir şekilde aşırı yüklenecek (bkz. operatör aşırı yükleme ). Dinamik olarak yazılmamış ve ad hoc polimorfizmden yoksun (tür sınıfları dahil) bazı diller gibi daha uzun işlev adlarına sahiptir. print_int, print_string, vb. Bu, kişinin bakış açısına bağlı olarak bir avantaj (daha açıklayıcı) veya bir dezavantaj (aşırı ayrıntılı) olarak görülebilir.

Bazen aşırı yüklemeden elde edilen bir avantaj, uzmanlaşmanın ortaya çıkmasıdır; örneğin, aynı ada sahip bir işlev, her biri üzerinde çalıştığı belirli veri türleri için optimize edilmiş birçok farklı şekilde uygulanabilir. Bu, performans nedenleriyle birden çok duruma özelleştirme gerektiren kod için uygun bir arabirim sağlayabilir. Olumsuz yanı, tip sisteminin farklı uygulamaların tutarlılığını garanti edememesidir.

Aşırı yükleme derleme zamanında yapıldığından, bunun yerine geçmez. geç bağlama bulunduğu gibi alt tipleme polimorfizmi.

Geç bağlama

Önceki bölüme rağmen, başka yollar da vardır. özel polimorfizm işe yarayabilir. Örneğin Smalltalk dilini düşünün. İçinde Smalltalk her aşırı yüklenmiş mesaj ("aşırı yüklenmiş işlev") için yöntemler ("işlev uygulaması") yürütülmek üzereyken çözüldüğünden, aşırı yükleme çalışma zamanında yapılır. Bu, program derlendikten sonra çalışma zamanında gerçekleşir. Bu nedenle, polimorfizm tarafından verilir alt tipleme polimorfizmi diğer dillerde olduğu gibi ve işlevsellik açısından da genişletilmiştir. özel çalışma zamanında polimorfizm.

Daha yakından bakıldığında Smalltalk'ın biraz farklı bir özel çok biçimlilik. Smalltalk geç bağlı bir yürütme modeline sahip olduğundan ve nesnelere anlaşılmayan mesajları işleme yeteneği sağladığından, belirli bir mesajı açıkça aşırı yüklemeden polimorfizm kullanarak işlevselliği uygulamak ve devam etmek mümkündür. Bu, genellikle günlük programlama için önerilen bir uygulama olmayabilir, ancak proxy'leri uygularken oldukça yararlı olabilir.

Ayrıca, genel anlamda ortak sınıf yöntemi ve yapıcı aşırı yüklemesi çok biçimlilik olarak kabul edilmese de, sınıfların normal nesneler olduğu daha tekdüze diller vardır. Smalltalk'ta, örneğin, sınıflar normal nesnelerdir. Buna karşılık, bu, sınıflara gönderilen mesajların aşırı yüklenebileceği anlamına gelir ve ayrıca sınıfları hiyerarşisinden miras almadan sınıflar gibi davranan nesneler oluşturmak da mümkündür. Bunlar Smalltalk'ın güçlü yansıtma yeteneklerinden yararlanmak için kullanılabilecek etkili tekniklerdir. Gibi dillerde de benzer düzenlemeler mümkündür. Kendisi ve Gazete.

Misal

Bir operatör hayal edin + aşağıdaki şekillerde kullanılabilir:

  1. 1 + 2 = 3
  2. 3.14 + 0.0015 = 3.1415
  3. 1 + 3.7 = 4.7
  4. [1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]
  5. [doğru, yanlış] + [yanlış, doğru] = [doğru, yanlış, yanlış, doğru]
  6. "bab" + "oon" = "babun"

Aşırı yükleme

Bu altı işlev çağrısını işlemek için dört farklı kod parçası gereklidir - veya üç, dizeler karakter listeleri olarak kabul edilirse:

Böylece adı + aslında üç veya dört tamamen farklı işlevi ifade eder. Bu bir örnektir aşırı yükleme(Son durumda kullanılan dizgi türlerinin kendi başlarına programcıya ödünç vermediğini unutmayın. doğal olarak toplama yerine birleştirme varsayımı kastedilmektedir; "123" + "456" 'yı düşünün, bu makul olarak "579" vermesi beklenebilir. Dolayısıyla aşırı yükleme, bir işlem için farklı uygulamaların yanı sıra farklı anlam veya anlambilim sağlayabilir.)

Referanslar

  1. ^ C. Strachey, Programlama dillerinde temel kavramlar. Bilgisayar Programcılığında Uluslararası Yaz Okulu ders notları, Kopenhag, Ağustos 1967