Downcasting - Downcasting

İçinde sınıf tabanlı programlama, aşağılık veya tür ayrıntılandırma eylemi döküm türetilmiş sınıflarından birine temel sınıfın başvurusu.

Birçoğunda Programlama dilleri, kontrol etmek mümkündür iç gözlem yazın atıfta bulunulan nesnenin türünün gerçekten atılan nesne mi yoksa türetilmiş türü mü olduğunu belirlemek ve bu durumda değilse bir hata vermek.

Başka bir deyişle, temel sınıfın bir değişkeni (ebeveyn sınıfı ) türetilmiş sınıfın bir değerine sahiptir (çocuk sınıfı ), aşağı doğru tahmin etmek mümkündür.

Örnekler

Java

halka açık sınıf Meyve{}  // ebeveyn sınıfhalka açık sınıf elma genişler Meyve{}  // alt sınıfhalka açık statik geçersiz ana(Dize argümanlar[]) {    // Aşağıdakiler üstü kapalı bir yayındır:    Meyve ebeveyn = yeni elma();    // Aşağıdakiler bir mahrumiyet. Burada, "parent" değişkeni olduğu için çalışır    // Apple'ın bir örneğini tutarak:    elma çocuk = (elma)ebeveyn;}

C ++

// Üst sınıf:sınıf Meyve { halka açık:  // Çalışma zamanı denetimli dinamik yayın kullanmak için çok biçimli olmalıdır.  gerçek ~Meyve() = varsayılan;};// Çocuk sınıfı:sınıf elma : halka açık Meyve {};int ana(int argc, sabit kömür** argv) {  // Aşağıdakiler örtük bir yaymadır:  Meyve* ebeveyn = yeni elma();  // Aşağıdakiler bir mahzurdur. Burada, "parent" değişkeni olduğu için çalışır  // Apple'ın bir örneğini tutarak:  elma* çocuk = dynamic_cast<elma*>(ebeveyn);  sil ebeveyn;}

Kullanımlar

Aşağı yayınlama, Ana değişken tarafından referans verilen değerin türü bilindiğinde ve genellikle bir değeri parametre olarak iletirken kullanıldığında yararlıdır. Aşağıdaki örnekte, objectToString yöntemi, String türünde olduğu varsayılan bir Object parametresini alır.

halka açık statik Dize objectToString(Nesne myObject) {    // Bu yalnızca myObject'in şu anda tuttuğu değer string olduğunda çalışır.    dönüş (Dize)myObject;}halka açık statik geçersiz ana(Dize argümanlar[]) {    // Bu, String'e geçtiğimizden beri çalışacaktır, bu nedenle myObject, String değerine sahiptir.    Dize sonuç = objectToString("Dizim");    Nesne Başarısız oldum = yeni Nesne();    // String değeri olmayan Object'e geçtiğimiz için bu başarısız olacak.    sonuç = objectToString(Başarısız oldum);}

Bu yaklaşımda downcasting, derleyicinin olası bir hatayı algılamasını engeller ve bunun yerine bir çalışma zamanı hatasına neden olur. MyObject öğesinin String türüne indirilmesi ('(String) myObject') derleme zamanında mümkün değildi çünkü myObject'in String türü olduğu zamanlar vardır, yani sadece çalışma zamanında aktarılan parametrenin mantıksal olup olmadığını anlayabiliriz. MyObject öğesini evrensel java.lang.Object.toString () kullanarak derleme zamanı String'e dönüştürebiliyor olsak da, bu, varsayılan toString () uygulamasının yardımcı olmadığı veya güvensiz olduğu ve istisna işlemenin bunu engelleyemediği durumlarda .

C ++ 'da, çalışma zamanı tür denetimi, dynamic_cast. Derleme zamanı aşağı tahmin, static_cast, ancak bu işlem tür denetimi yapmaz. Yanlış kullanılırsa, tanımlanmamış davranışlara neden olabilir.

Eleştiri

Gibi bazı diller OCaml, tamamen yok saymaya izin vermeyin.[1]

Kötü düşünülmüş bir tasarımın popüler bir örneği, en iyi türler,[kaynak belirtilmeli ] gibi Java önce konteyner Java jenerikleri yeniden kullanılabilmeleri için içerilen nesnelerin aşağı doğru izlenmesini gerektiren tanıtıldı.

Ayrıca bakınız

Referanslar

  1. ^ Vouillon, Jérôme; Rémy, Didier; Garrigue, Jacques (12 Eylül 2013). "OCaml'deki nesneler". OCaml sistemi 4.01 sürümü: Belgeler ve kullanım kılavuzu.

Dış bağlantılar