2016-04-11 23 views
0

Temel sınıfları genişleten bir grup sınıfa sahibim. Temel sınıf bir yöntem diyelim etti:java Generics - Çocuk sınıfı tipini ve süper sınıfı tanıyan çocuk aşırı yüklenmiş yöntem nasıl çağırılır

doStuff1(int variable){ do something;} 

Bu sınıfların her biri bir sahiptir: Başka bir sınıfta

doStuff1(String string) {convert string to number and call super.doStuff1(intResult)}; 

, yöntem ben böyle bir şey var:

public void bla(Class<?> childClass, SuperClass childClassInDisguise) { 
    (childClass.cast(childClassInDisguise)).doStuff1(myString); 
} 

Yapamam Bu nedenle derlemek: doStuff1 (myString) yöntemi, # 17-türü yakalama türü için tanımlanmamıştır?

Burada yanlış olan ne yapıyorum? Bu mümkün mü?

Teşekkürler. derleyici Buna temsil ettiği sınıf bilmiyorum

+0

(belki ilgisiz) Her bir çocuk sınıfına uygulayacaksanız, neden bunu soyut yapmıyorsunuz? Ayrıca: Ben bu tür bir döküm görmedim (çalışmadığını söyleyerek); Neden klasik '((SuperClass) childInDisguise) .doStuff1 (myString);'? – dquijada

+0

Temel sınıfın bir yöntemi olan doStuff1 (String)? –

+0

'' '(childClass.cast (childClassInDisguise))' '', SuperClass olmayan bir nesneyi döndürür. (" Joseph

cevap

0

,

Class<?> 

ve nesne açısından bildiği tek ipucu, bir üst sınıfı olmasıdır ki sadece doStuff1 (int)

var

doStuff1 (String) öğesini gerçekten çağırmak istiyorsanız, neden bu yöntemi içeren başka bir alt sınıf oluşturmayın ve bu yöntemi soyut olarak işaretleyin. Mevcut alt sınıflar bu yeni alt sınıfı genişletmelidir.

public <T extends NewSubclass>void bla(Class<T> childClass, SuperClass childClassInDisguise) { 
     (childClass.cast(childClassInDisguise)).doStuff1(myString); 
    } 

Bu şekilde, derleyici o soyut yöntem içerir NewSubclass alt sınıfları olan nesnenin miras hiyerarşi bilir gibi

public abstract class NewSubclass extends Superclass { 
    public void abstract doStuff1(String); 
} 

Sonra yönteminde, genel bir parametreyi ekleyin.

DÜZENLEME

sadece bla yöntemi düzenleyebilirsiniz, bu deneyin,

public void bla(Class<?> childClass, SuperClass childClassInDisguise) { 
     if(childClass.equals(ChildClass1.class) { 
     (ChildClass1(childClassInDisguise)).doStuff1(myString); 
    } else ... { 
    } 
} 

diğer bilinen alt sınıfları koşul ise de yapın. Sabit kodlamasını biliyorum, ancak söz konusu sınıfları değiştirerek jenerik + soyut süper sınıfı kullanamazsanız bu tek yoldur. Ama yine de ilk önerimi daha az koddan ve dinamikten beri tercih ediyorum, başka bir alt sınıf eklediğinizde, ikinci önermeden farklı olarak bla metodunu (POLYMORPHISM'in gücü) değiştirmeniz gerekmez. Bu daha çok tasarım rekonstrüksiyonudur.

+0

başka bir yolu var mı? çünkü önerilen değişiklik yapamıyorum çünkü. – John11

+0

evet var, doStuff1 ile alt sınıflardan herhangi biri ile eşleşiyorsa, childClass öğesinde instanceof kullanıldığında bir strateji modeli kullanmaya çalışabilirsiniz, ancak bu bir çeşit kodlanmış. Ama hangi kodu doğrudan değiştirebilirsin? – vine

+0

Yalnızca bla yöntemini içeren kodu değiştirebilirim. – John11

İlgili konular