2010-04-06 13 views
23

Olası Çoğalt: Java Büyük ebeveynlerin yöntemi nasıl çağırılır?


Why is super.super.method(); not allowed in Java?

ı 3 sınıfları A, B ve C, bir önceki uzanan her biri olduğunu varsayalım. B da myMethod uygulaması halinde

nasıl C.myMethod() den A.myMethod() kodu denir?

class A 
{ 
    public void myMethod() 
    { 
    // some stuff for A 
    } 
} 

class B extends A 
{ 
    public void myMethod() 
    { 
    // some stuff for B 
    //and than calling A stuff 
    super.myMethod(); 
    } 
} 

class C extends B 
{ 
    public void myMethod() 
    { 
    // some stuff for C 
    // i don't need stuff from b, but i need call stuff from A 
    // something like: super.super.myMethod(); ?? how to call A.myMethod(); ?? 
    } 
} 
+0

Bunu neden yaptın? Bir örnek verebilir misin? – Macarse

cevap

18

Yapamazsınız. Bu kasıtlı. Alt sınıflar için bir arabirim (Java anahtar sözcükte değil) gibi bir arabirim sağlar. A.myMethod'un işlevselliğine doğrudan erişim vermemeyi seçmiştir. Bu işlevselliği sağlamak için B gerekiyorsa, bunun için farklı bir yöntem kullanın (farklı ad, protected yapın). Bununla birlikte, "kalıtım üzerinden kompozisyonu tercih etmek" muhtemelen daha iyidir.

+0

Teşekkürler çocuklar! tasarımımı yeniden irdelemeye çalışacağım. – Arkaha

+0

Arkaha, sorunun cevabına bakın. Bir üst sınıf tarafından tanımlanan bir yöntemin hemen atamız olmadığını (söz gelimi * süper *) çağırmak sözdizimsel olarak mümkündür. Fakat bunun için geçerli bir nedene sahip olmanız gerekir. –

0

Yapabileceğinden emin değilim. Java, tüm yöntemleri varsayılan olarak sanal hale getirir. Bu, en basit çözümün işe yaramayacağı anlamına gelir: A türünde bir değişken bildirin, C örneğinizi atayın ve myMethod numaralı telefonun çağrılması, C.myMethod çağrılmaya neden olur.

A türünü yansıtmayı ve yöntemlerini doğrudan çağırmayı deneyebilirsiniz. Bu durumda ne olacağını görmek ilginç olurdu, ancak sanal gönderim gerçekleşmezse şaşırırdım ...

2

Yapamazsınız ve yapmamalısınız.

Bu, kötü tasarımın bir göstergesidir. Ya bir yöntemi yeniden adlandırın ya da başka bir yöntemde veya bir yardımcı sınıfta gerekli ortak işlevselliği ekleyin.

+1

Yansıma * ayrıca * bunu yapmanın bir yolunu sağlamaz, normal çalışma zamanı polimorfizm kuralları ** yine de ** uygular. Hatta "super.super.myMethod()" ifadesini kullanmadan "super.myMethod()" ifadesini yansıtma kullanarak uygulayamazsınız. –

+0

doğru. güncellenmiş. – Bozho

+0

Gerekirse, iç sınıfları tanımladığınızda (örneğin, Swing'deki eylem dinleyicilerini tanımlamak veya sınıfları geri çağırmak) bunu yapmanız gerekir. Bu durumların dışında, evet, bu kötü bir tasarımdır, ama * kendi başına * değildir. Java sözdizimi her neyse onu destekliyor (Arkaha'nın sorusuna cevabımı görün.) –

İlgili konular