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?
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?
Yanıtlar:
[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" .
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.)
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.