Is-a - Is-a

İçinde Bilgi temsili, nesne yönelimli programlama ve tasarım (görmek nesne odaklı program mimarisi ), bir (is_a veya bir) bir kapsama[1] arasındaki ilişki soyutlamalar (Örneğin. türleri, sınıflar ), burada bir sınıf Bir bir alt sınıf başka bir sınıfın B (ve bu yüzden B bir süper sınıf nın-nin BirBaşka bir deyişle, A tipi, A olduğu zaman B türünün bir alt türüdür. Şartname B'nin spesifikasyonunu ima eder. Yani, A'nın spesifikasyonunu karşılayan herhangi bir nesne (veya sınıf), B'nin spesifikasyonunu da karşılar, çünkü B'nin spesifikasyonu daha zayıftır.[2]

bir ilişki ile karşılaştırılmalıdır var-a (has_a veya var) türler (sınıflar) arasındaki ilişki; ilişkileri karıştırmak var-a ve bir bir model tasarlarken yaygın bir hatadır (ör. bilgisayar programı ) bir nesne ile astı arasındaki gerçek dünya ilişkisinin). bir ilişki aynı zamanda örneği nesneler (örnekler) ve türler (sınıflar) arasındaki ilişki: bkz. "tür belirteci ayrımı " ve "tür belirteci ilişkileri."[3]

İlişkileri özetlemek gerekirse:

  • hiperonimhiponim Bir taksonomik hiyerarşi tanımlayan türler (sınıflar) arasındaki (süper tür-alt tür) ilişkiler, burada
    • için kapsama ilişki: bir hiponim (alt tür, alt sınıf) bir bir çeşit (bir) hiper ismi (süper tip, üst sınıf) ile ilişkisi;
  • holonymticari isim iyelik hiyerarşisini tanımlayan türler (sınıflar) arasındaki (tam / varlık / kapsayıcı parçası / kurucu / üye) ilişkiler, burada
    • bir ... için toplama (yani sahiplik olmadan) ilişki:
      • holonym (bütün) bir var-a onun ticari adı (parçası) ile ilişkisi,
    • için kompozisyon (yani sahiplik ile) ilişkisi:
      • bir ticari isim (kurucu) bir parçası holonym (varlık) ile ilişkisi,
    • için muhafaza[4] ilişki:
  • türler (sınıflar) ve nesneler (örnekler) arasındaki kavram-nesne (tür belirteci) ilişkileri, burada
    • bir belirteç (nesne) bir örneği türü (sınıfı) ile ilişki.

Alt tipleme örnekleri

Alt tipleme belirli bir türün başka bir tür veya soyutlama ile ikame edilmesini sağlar. Alt tiplemenin bir bir Dil desteğine bağlı olarak alt tür ile bazı mevcut soyutlamalar arasındaki ilişki, örtük veya açık olarak. İlişki, bir alt tipleme mekanizması olarak kalıtımı destekleyen dillerde kalıtım yoluyla açıkça ifade edilebilir.

C ++

Aşağıdaki C ++ kodu, sınıflar arasında açık bir miras ilişkisi kurar B ve Bir, nerede B hem bir alt sınıf hem de alt türü Birve bir Bir her yerde B belirtilir (bir referans, bir işaretçi veya nesnenin kendisi aracılığıyla).

sınıf Bir{ halka açık:   geçersiz Benzer bir şey() sabit {}};sınıf B : halka açık Bir{ halka açık:   geçersiz DoSomethingBLike() sabit {}};geçersiz KullanımAnA(Bir sabit& bir_A){   bir_A.Benzer bir şey();}geçersiz SomeFunc(){   B b;   KullanımAnA(b); // b, bir A yerine kullanılabilir.}

[5]

Python

Aşağıdaki python kodu, sınıflar arasında açık bir miras ilişkisi kurar B ve Bir, nerede B hem bir alt sınıf hem de alt türü Birve bir Bir her yerde B gereklidir.

sınıf Bir:    def do_something_a_like(kendini):        geçmeksınıf B(Bir):    def do_something_b_like(kendini):        geçmekdef use_an_a(some_a):    some_a.do_something_a_like()def some_func():    b = B()    use_an_a(b)  # b bir A ile değiştirilebilir.

Aşağıdaki örnek, türü (a) "normal" bir tür ve tür (tip (a)) bir metatiptir. Dağıtılmış haldeyken tüm türler aynı meta türüne (PyType_Type, aynı zamanda kendi meta tipidir), bu bir gereklilik değildir. Olarak bilinen klasik sınıfların türü types.ClassType, aynı zamanda farklı bir meta türü olarak kabul edilebilir.[6]

>>> a = 0>>> tip(a)<type 'int'>>>> tip(tip(a))<type 'type'>>>> tip(tip(tip(a)))<type 'type'>>>> tip(tip(tip(tip(a))))<type 'type'>

Java

Java'da bir Bir sınıfın veya arabirimin tür parametreleri ile diğerinin tür parametreleri arasındaki ilişki, uzantılar tarafından belirlenir ve uygular maddeleri.

Koleksiyonlar sınıflarını kullanarak ArrayList , Listesini uygular ve List , Koleksiyonunu genişletir. Dolayısıyla, ArrayList , Collection alt türü olan List 'in bir alt türüdür. Alt tipleme ilişkisi, tipler arasında otomatik olarak korunur. İsteğe bağlı bir değeri ilişkilendiren PayloadList arabirimi tanımlanırken genel tür Her elemanla birlikte P, beyanı şöyle görünebilir:

arayüz Yük Listesi<E, P> genişler Liste<E> {    geçersiz setPayload(int indeks, P val);    ...}

PayloadList'in aşağıdaki parametrelendirmeleri List alt türleridir:

Yük Listesi<Dize, Dize>Yük Listesi<Dize, Tamsayı>Yük Listesi<Dize, İstisna>

Liskov ikame ilkesi

Liskov ikame ilkesi bir özelliği açıklar, "S tipindeki her o1 nesnesi için, T'ye göre tanımlanan tüm P programları için, o2 ile ikame edildiğinde P'nin davranışı değişmeyecek şekilde T tipinde bir o2 nesnesi varsa, o zaman S, T'nin bir alt tipidir,".[7] Aşağıdaki örnek bir LSP ihlalini göstermektedir.

geçersiz DrawShape(sabit Şekil& s){  Eğer (typeid(s) == typeid(Meydan))    DrawSquare(static_cast<Meydan&>(s));  Başka Eğer (typeid(s) == typeid(Daire))    DrawCircle(static_cast<Daire&>(s));}

Açıkçası, DrawShape işlevi kötü biçimlendirilmiş. Shape sınıfının her türev sınıfını bilmek zorundadır. Ayrıca, yeni Shape alt sınıfı oluşturulduğunda değiştirilmelidir. İçinde nesneye yönelik tasarım birçok[DSÖ? ] bunun yapısını anatema olarak gör.

İşte LSP'nin ihlaline dair daha ince bir örnek:

sınıf Dikdörtgen{  halka açık:    geçersiz   SetWidth(çift w)  { itsWidth = w; }    geçersiz   SetHeight(çift h) { yüksekliği = h; }    çift GetHeight() sabit   { dönüş yüksekliği; }    çift GetWidth() sabit    { dönüş itsWidth; }  özel:    çift itsWidth;    çift yüksekliği;};

Bu iyi çalışıyor ancak Rectangle sınıfını miras alan Square sınıfına gelince, LSP'yi ihlal ediyor olsa bile bir ilişki Dikdörtgen ve Kare arasında geçerlidir. Çünkü kare dikdörtgendir. Aşağıdaki örnek, sorunu gidermek için iki işlevi, Setwidth ve SetHeight'ı geçersiz kılar. Ancak kodu düzeltmek, tasarımın hatalı olduğu anlamına gelir.

halka açık sınıf Meydan : Dikdörtgen{  halka açık:    gerçek geçersiz SetWidth(çift w);    gerçek geçersiz SetHeight(çift h);};geçersiz Meydan::SetWidth(çift w){    Dikdörtgen::SetWidth(w);    Dikdörtgen::SetHeight(w);}geçersiz Meydan::SetHeight(çift h){    Dikdörtgen::SetHeight(h);    Dikdörtgen::SetWidth(h);}

Aşağıdaki örnek, g işlevi yalnızca Rectangle sınıfı için çalışır ancak Square için çalışmaz ve bu nedenle açık-kapalı ilkesi ihlal edilmiştir.

geçersiz g(Dikdörtgen& r){  r.SetWidth(5);  r.SetHeight(4);  iddia etmek(r.GetWidth() * r.GetHeight()) == 20);}

[8]

Ayrıca bakınız

Notlar

  1. ^ Görmek Liskov ikame ilkesi.
  2. ^ "Alt Türler ve Alt Sınıflar" (PDF). MIT OCW. Alındı 2 Ekim 2012.
  3. ^ Tür-simge ilişkileri
  4. ^ Ayrıca bakınız Kapsama (bilgisayar programlama).
  5. ^ Mitchell, John (2002). Nesne yönelimli dillerde "10" Kavramlar"". Programlama dilinde kavramlar. Cambridge, İngiltere: Cambridge University Press. s. 287. ISBN  0-521-78098-5.
  6. ^ Guido van Rossum. "Yerleşik Türleri Alt Yazma". Alındı 2 Ekim 2012.
  7. ^ Liskov, Barbara (Mayıs 1988). Veri Soyutlama ve Hiyerarşi (PDF). SİGPLAN Bildirimleri.
  8. ^ "Liskov İkame İlkesi" (PDF). Robert C. Martin, 1996. Arşivlenen orijinal (PDF) 5 Eylül 2015 tarihinde. Alındı 2 Ekim 2012.

Referanslar