Kalıtım alt tiplemeden nasıl farklıdır?


15

Programlama dili perspektifinde alt tiplemenin anlamı nedir? "Kalıtım alt tip değildir" diye duydum. O zaman miras ve alt tipleme arasındaki farklar nelerdir?


6
Acaba bu soru (ve benzeri diğerleri) yeni beta girdiğinde yeni cs.SE sitesine yönlendirilip yönlendirilemeyeceğini merak ediyorum.
Suresh Venkat

1
Teorik bilgisayar biliminde (TCS) araştırma düzeyinde sorular için bir soru-cevap sitesi olan cstheory'ye hoş geldiniz. Sorunuz TCS'de araştırma düzeyinde bir soru gibi görünmüyor. Bunun ne anlama geldiğiyle ilgili daha fazla bilgi ve sorunuza cevap verebilecek siteler için öneriler için lütfen SSS sayfasına bakın . Son olarak, sorunuz kapsam dışında olduğu için kapalıysa ve soruyu araştırma düzeyinde bir soru haline getirmek için düzenleyebileceğinizi düşünüyorsanız, lütfen çekinmeyin. Kapatma kalıcı değildir ve sorular tekrar açılabilir, daha fazla bilgi için SSS bölümüne bakın.
Kaveh

3
@UdayReddy: İlk cevaplandığında hiçbir soru önemsiz değildi, ancak modern bakış açısıyla bir karar vermeliyiz. Sizinkiyle aynı argüman, Dijkstra'nın algoritması hakkındaki sorunun konuyla ilgili olduğunu ima eder, çünkü ilk makale bundan bahseder ve başka bir şey konuşmaz.
Tsuyoshi Ito

3
@TsuyoshiIto Dijkstra'nın ilk makalesi problemi çözdüğü için benzetme uygun değil , oysa Cardelli'nin ilk gazetesi problemi yarattı . Yine de, ilk makaleye dayanarak teknolojinin durumunu ölçmediğimizi düşünüyorum. Size miras ve alt tipleme arasındaki farkların çözülmüş bir sorun olmadığını göstereceğim ve konunun en az 20 yıl daha tartışılacağını tahmin ediyorum. Sorguya araştırmacı düzeyindeki sorunları açıklığa kavuşturmak için ek ödevler yapması ve soruyu düzenlemesi tavsiye edilebilir.
Uday Reddy

3
Her durumda, OP'yi
Andreas Rossberg

Yanıtlar:


18

[Nesne yönelimli yazı sistemleri konusunu derinlemesine düşünmedim, ancak tartışmayı başlatmak için bildiklerimi söyleyeceğim.]

Biz demek alt tipidir B tüm eğer bir değerleri her bağlamda kullanılabilir -typed B değerleri beklenmektedir -typed. Ya da başka bir deyişle, A- tipi değerler B- tipi değerler olarak "maskelenebilir" .birBbirBbirB

Böyle bir maskeleme tip kontrolüyle ilgili herhangi bir sorun yaratmazsa , yani B tipi değerlere ihtiyaç duyulan tipi değerlerin eklenmesi tip kontrolüne devam ederse, buna "yapısal alt tipleme" diyoruz . Davranışla ilgili herhangi bir soruna neden olmazsa, örneğin, bu tür tıkanma beklenen davranışı değiştirmezse, buna "davranışsal alt tipleme" diyoruz . ("Beklenen davranış" ayrı olarak resmileştirilmelidir ve birçok davranış kavramı mümkündür.)birB

Yapısal alt tipleme davranışsal alt tiplemeyi garanti etmez, çünkü bir türün yapısı kazara sebeplerle eşleşebilir. Ancak, beklenen davranışı tanımlamak kolay değildir. Bu nedenle, birçok programlama dili, kullanıcının hangi türün alt türü olduğunu bildirmesi gereken bir ara nokta kullanır. Buna "nominal alt tipleme" denir . Örtük ve açık alt tipleme ile ilgili soruya bakınbu konunun tartışılması için. Fikir, programcının kendi yaratıcılığını kullanarak beyan edilen tüm alt tipler için davranışsal alt tipleme sağlaması gerektiğidir. Dil herhangi bir yardım sunamaz. Bununla birlikte, beyan edilen tüm alt tipler en azından yapısal alt tipler olmalıdır. Aksi takdirde, program check yazamaz. Dil bunun sağlanmasına yardımcı olabilir. (Bazı programlama dillerinde bunu derleme zamanında sağlamak için yeterli tipte sistem yoktur. Öyleyse, tip hatası çalışma zamanında algılanır veya belki de yanlış sonuçlar elde edilebilir. Bu tip delikler açıkça istenmez.)

Kişi nesne yönelimli programlarda alt sınıflar tanımladığında, genellikle herkes tarafından görülebilir alanlar (veya yöntemler) eklenir. Çoğu programlama dilinde, bu alt sınıflar nominal alt tür olarak kabul edilir . Soru, bunların aynı zamanda yapısal alt tipler olup olmadığıdır . Değilse, yani programlama dili, yapısal alt tip olmayan nominal alt tipleri bildirmeye izin verirse, programlama dilinde tip delikleri olacaktır.

Basit durumlarda, alan eklemek işe yarar. Üst sınıfın türü, alt sınıfın türünden daha az alan bekler. Bu nedenle, sueprclass örneğinin beklendiği bir alt sınıf örneğini bağlarsanız, program sağlanan ek alanları yoksayar ve hiçbir şey ters gitmez.

Ancak, üst sınıf veya alt sınıf, kendisiyle aynı türden bağımsız değişkenler alan veya kendisiyle aynı türden sonuçlar döndüren yöntemlere sahipse, sorunlar ortaya çıkar. O zaman alt sınıfın arayüz tipi, üst sınıfın yapısal bir alt tipi değildir . Java gibi yaygın olarak kullanılan tür güvenli programlama dilleri bu alt sınıflara izin vermez. Bu nedenle dili güvenliğini sağlamak için dili kısıtlarlar . Eiffel programlama dilinin, bunun yerine esneklik elde etmek için tip güvenliğinden ödün verdiği söylenir . Esnekliği koruyan güçlü bir tip sistem tasarlanırsa, alt sınıfların alt türlere yol açması ilkesinden vazgeçilmelidir. Bu nedenle "Kalıtım alt tip değildir" başlıklı makalenin başlığı. Yazarlar, bunun yerine çalışan farklı bir yüksek dereceli alt tip kavramı önerirler. Kim Bruce'un da aynı etkiyi yaratan "eşleştirme" adında yakından ilişkili bir teklifi var. Bu sunuma bakın . Ayrıca yararlı Andrew Black bir pozisyon kağıdı .

Anlambilim topluluğu büyük olasılıkla sorunu büyük ölçüde göz ardı etmekte hatalıdır. Geleneksel olarak, teorik olarak çok az ilgi çekici olan pratik bir tip sistem mühendisliği meselesi olarak gördük. Durum böyle değilse ve gerçekten bölgede bazı anlambilim çalışmaları varsa, umarım diğer insanlar onlardan bahseder.


1
Belki de alt tiplemeyi mirastan, örneğin nesne sisteminde Ocaml'den başarıyla ayıran gerçek diller olduğunu belirtmek gerekir.
Andreas Rossberg

@AndreasRossberg Gerçekten, bu cevabı yazdığımda OCaml benim çerçevemde değildi. Herhalde OCaml'ın nominal alt tipine sahip olmadığını düşünüyorum. Yani, bu konuların bazıları ortaya çıkmayacaktı. Ancak, davranışlar olmasa bile türlerin yanlışlıkla eşleşmesi olasılığı vardır ve tür sistemi bu tür hataları yakalamaya yardımcı olamaz.
Uday Reddy
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.