Ördek bir polimorfizm alt kümesi yazıyor mu


17

WIkipedia Üzerinde Polimorfizm'den

Bilgisayar biliminde, polimorfizm, farklı veri türlerinin değerlerinin tekdüze bir arayüz kullanılarak ele alınmasını sağlayan bir programlama dili özelliğidir.

Wikipedia'da yazarak ördek

Nesne yönelimli programlama dilleri ile bilgisayar programlamasında, ördek yazma, bir nesnenin geçerli yöntem ve özellik kümesinin, belirli bir sınıftan veya belirli bir arabirimin uygulanmasından miras almak yerine geçerli semantiği belirlediği bir dinamik yazma tarzıdır.

Benim yorumum, ördek yazımına dayanarak, nesne yöntemleri / özelliklerinin geçerli semantiği belirlemesi. Yani nesnelerin mevcut şekli, koruduğu arayüzü belirler.

Polimorfizmden, bir işlevin, bir arabirimi destekledikleri sürece birden fazla farklı veri türünü kabul etmesi durumunda polimorfik olduğunu söyleyebilirsiniz.

Bu nedenle, bir işlev tür yazabilirse, birden fazla farklı veri türünü kabul edebilir ve bu veri türlerinin doğru yöntemlere / özelliklere sahip olduğu ve bu nedenle arabirimi desteklediği sürece üzerinde çalışabilir.

(Arayüz terimi kullanımı bir kod yapısı olarak değil, daha çok tanımlayıcı bir dokümantasyon yapısı olarak kastedilmektedir)

  • Ducktyping ve polimorfizm arasındaki doğru ilişki nedir?
  • Bir dil yazabilirse, bu polimorfizm yapabileceği anlamına mı geliyor?

1
Bir cevapta ne aradığınızdan emin değilim. Her ikisini de doğru bir şekilde tanımladınız, bu yüzden olduğu kadar kesin bir cevabınız var. Ördek yazmanın polimorfizm olarak "önemli" olup olmadığına karar vermek felsefi bir soru mu, belki de böyle ifade ediyorsanız bir terminoloji sorusu mu? Peki bir cevapta ne arardınız?
psr

@psr "Ben şöyle yorumluyorum. Yanlış mıyım? Haklı mıyım? Bunu şu şekilde söyleyen tekrarlanabilir akademik insanlar var mı? Bu konuda herhangi bir makale var mı?" Temel olarak "ördek tipleme polimorfizmin bir uygulaması / alt kümesidir" den başka ayrıntılı olarak ilişki hakkında başka ne söylenebilir?
Raynos

anladığım kadarıyla, homografi ördeğin , bir polimorfizm değil ya da en azından Wikipedia'nın onu nasıl tanımladığı anlamında değil, tekdüze arayüzden başka bir şey yazmasını sağlar . Örn door.close()vetiger.close()
gnat

4
Ördek tipleme, Ad-hoc polimorfizm örneğidir . Bunu fazla düşünüyorsun.
yannis

Yanıtlar:


16

Ben polimorfizmin çeşitli şekillerde uygulanabilen genel bir özellik olduğunu söylüyorum:

  • sınıf temelli kalıtım.
  • prototip tabanlı nesneler (kalıtımla veya kalıtım olmadan)
  • ördek yazarak
  • arayüz uyumluluğu (Go'nun arayüzleri tarafından ve dolaylı olarak C ++ şablonlarında yapıldığı gibi)

her biri programcının farklı tiplerde tek bir kod kullanmasına izin verir, bu nedenle hepsi polimorfizm kavramını somutlaştırır.


7

Bence:

Hem ördek tiplemesi hem de polimorfizm dolaylı / soyutlama aracıdır. Çok biçimlilik türler ve yazım üzerine kurulmuş, ördek yazım sözleşmeler üzerine kurulmuştur.

Polimorfizmde, ŞEYİN ne olduğu ve nasıl davrandığı önemlidir (davranışı, ne olduğu sonucu olabilir).

Ördek yazarken bir şeylerin nasıl davrandığı önemlidir. Ördek yazım, bazı tanımlanmış özelliklere sahip nesneler yerine mesaj alışverişi yapan aktörler olarak nesne kavramına daha fazla bağlıdır.


2
Bu yanlış. Çok biçimlilik, birçok şeyi kapsayan büyük bir şemsiye. Özellikle ördek tipini kapsar. Bu nedenle, ördek tipi bir çeşit polimorfizmdir.
Thomas Eding

Katılmıyorum. Davranışsal yöntemlerle geleneksel miras aynı özelliklere sahiptir. Bir nesne ne davranışına olarak açık kalarak sadece daha fazla tip-güvenli garantili sergi (diğer davranışları dışlamaz hangi!)
marstato

6

Cevap EVET .

Yazma Ördek özel bir durumdur dinamik yazarak ve dinamik yazarak bile başlı başına genellikle teknikleri, (derleme zamanında ziyade zamanında tip kontrolü gerçekleştirmek için dilin sadece mülkiyet olduğundan) doğrudan polimorfizm olarak kabul edilemez dinamik tiplendirmenin altında, bu tür geç bağlama ve dinamik gönderme polimorfizm için karakteristiktir .


Wikipedia makalesi ve günümüzde kaç kişinin bu terimi kullandığındaki sorun, ilk gördüğümde (yani bir tür yazma) ördek yazmanın ne anlama geldiğini tanımlamaması değil, sadece yöntemleri çağırıp bir tanımlanmadığında çalışma zamanı hatası. Eric Lippert'in açıkladığı gibi , bu yazmak değil, yazmaktan kaynaklanıyor .
reinierpost

1

Ördek tiplemesi, polimorfizmin bir alt kümesi değildir, çünkü polimorfizm, ördek tiplemesinde kaybolan açıklık gerektirir. Ördek yazmanın semantik mantıklı olduğu için değil, aynı imzanız olduğu için bir "arayüz" uygulama şansı vardır. Ördek tiplemesi bir polimorfizmin alt kümesi olsaydı, açık beyan da dahil olmak üzere polimorfizmin tüm özelliklerine sahip olurdu.

Ördek yazımı da gerçekten polimorfizmin bir uygulaması değildir, farklı bir tip sistemin bir parçasıdır. Genellikle ördek yazmayı, nesnenin işleyip işlemediğini bilmeden bir nesneye bir mesaj ileten dinamik bir dil ile ilişkilendirirsiniz - eğer yapabilirse, ördek yazma testini etkili bir şekilde geçti. Genellikle polimorfizmin, derlenebilir zamanda (ve arabirimler sınıflardan farklıysa itables) kurarak derlendiğini düşünüyorsunuz. Ancak orada birçok dil ve bu özellikleri uygulamanın birçok yolu var.

Bir dereceye kadar bu felsefi bir sorudur. Ördek yazmayı otomatik olarak örtülü olarak bildirilen arabirimler olarak düşünebilir misiniz? Bunun yanlış olduğunu hiçbir şekilde düşünemiyorum, ama muhtemelen ona bakmak için en verimli yol olduğunu düşünmüyorum. Ördek yazım ve arayüzlerin her ikisi de programlama dilinin tip sistemlerinin yaygın olarak karşılaştığı özelliklerdir, her ikisi de oldukça benzer davranış biçimlerine sahiptir ve her ikisi de programcıların anlaması için önemlidir.


6
“polimorfizm açıklık gerektirir” nerede diyor? sınıf temelli miras sadece bir tür polimorfizmdir, sadece bir tür polimorfizmdir.
Javier

Ve @ Javier'in yorumu devam ediyor, geçici polimorfizm ne olacak ?
yannis

@YannisRizos - Böyle bir soruyu cevaplamanın problemi, ne kadar çok dil ve o kadar çok terminoloji olması, ne derse desin, birisinin seni nitelendirebilmesidir. Neden "ad hoc polimorfizm" in adında "polimorfizm" kelimesinin bulunduğunu anlıyorum, ama bunun OP'nin "polimorfizm" ile kastettiğinden başka bir şey olduğunu iddia ediyorum.
psr

@Javier - Listelediğiniz tüm yöntemler ördek yazma dışında açıklık gerektirir.
psr

@psr Aslında OP'nin "polimorfizm" ile ne anlama geldiği umurumda değil. Kimsenin umursaması gerektiğini düşünmüyorum, çok basit bir tanımla bilimsel bir kavram, kendi yorumlarımıza veya OP'nin yorumu olduğuna göre ne düşünebileceğimize inanmıyorum. Özellikle OP yorumlaması, varsayılan olarak sorduğu için, yorumu hakkında emin değildir. Bunun felsefi bir soru olduğuna katılmıyorum, belirtildiği gibi soru basit bir cevabı olan bilimsel bir soruydu: Evet ördek yavrusu, bir polimorfizmin bir alt kümesi olan bir tür geçici polimorfizmdir.
yannis

1

"Evet, eğer foo ördek yazıyorsa, foo polimorfizm var" demek neredeyse doğal hissettiriyor. Ama belki de bu bir anlamda, emin bu% 100 diyemem olan o && su == üzerinde yüzer vak olabilir ördek yazarak ( "vardır böyle sistemin yapay örnekler ile gelip mümkün> öyle bir Ördek ") polimorfizm (" foo, quack! "Başarısız olur) olmasa da, gerçekten yapay olurlar ve gerçek bir dünyada," Evet, eğer ördek tipi varsa, polimorfizm de mevcut olmalı "diyorum.

Şahsen ördek yazmayı "doğru yapılmış polimorfizm" olarak görüyorum. Bununla ne demek istediğim, bir ördek yazma dünyasında var olan şey herhangi bir açık türleri olması gerekmez ve (polimorfik = "aynı erişim, farklı sonuç") davranışları sayılır tek şeydir. Polimorfizmin diğer uygulamalarında, tipler / arayüzler / kalıtım ile sınırlıdır, bu nedenle "kendiliğinden bir polimorfizm" değil "uygulamalı ve kısıtlı polimorfizm" dir.


0

Statik olarak yazılan programlama dilleri, daha önce hata kontrolüne, disiplinli programlama stillerinin daha iyi uygulanmasına ve tüm tür tutarlılık kontrollerinin çalışma zamanında gerçekleştirildiği dillerden daha verimli nesne kodu oluşturulmasına izin verir.

(B. Pierce ve arkadaşları)

Dikkat edeceğiniz gibi, bu bağlamda, ördek yazım dinamik bir yazımdır, aksi takdirde bunlardan başka bir çalışma.

Polimorflama ile ilgili tipin belirlenmesi için bir yöntem vardır, örneğin kodu daha esnek kılar, ancak ördek tiplemesi bu durumlarda tamamen başka bir konudur.

Ayrıntılı olarak, hesaplama ve hesaplama özelliklerinin belirlenmesine yardımcı olan yazılan lambda hesabı ve türlenmemiş lambda hesabı vardır.

Ördek yazmak gibi şeylerin sadece hızlı bir sonuç almak istiyorsak yardımcı olabileceğini görüyorum, ancak diğer durumlarda dinamik doğanın ihtiyaçları için daha ayarlanabilir hale getirdiğini hissediyorum, böylece daha hızlı hesaplayabiliyorum. Sanırım bu sadece söylemek istiyorum, eğer zaten hesaplamak istediğimi gerçekten biliyorsam, yazılan en iyisi, ama neden istediğimi biliyorum? Hehehe ...

Bu benim beş sentim ve sanırım bu ilginç bir araştırma konusu yapabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.