2010-11-04 15 views
24

Java'da bir sınıfın hangi sınıfları genişleteceğini nasıl belirleyebilirim?Java'da bir sınıfın başka bir sınıfı mı uzattığını nasıl belirlerim?

public class A{ 
} 

public class B extends A{ 
} 

public class C extends A{ 
} 

public class D{ 
} 

public class E extends B{ 
} 

public class doSomething{ 

    public void myFunc(Class cls){ 
     //need to check that cls is a class which extends A 
     //i.e. B, C and E but not A or D 
    } 
} 

cls.getSuperClass() neye ihtiyacım var?

cevap

48

getSuperClass() yaklaşımı,numaralı ilke için başarısız olur, çünkü onun hemen üst sınıfı, A değil, B. Daha çok Class#isAssignableFrom() kullanın. Zaman kontrolü derleme istiyorsanız

public void myFunc(Class cls){ 
    //need to check that cls is a class which extends A 
    //i.e. B, C and E but not A or D 

    if (cls != A.class && A.class.isAssignableFrom(cls)) { 
     // ... 
    } 
} 
+0

Bu, önerilen en iyi çözümdür, ancak bunu yapmaya çalışanın bir "kod kokusu" olduğunu eklemeliyim. Martin Broadhurst'un önerdiği gibi bunu yapmanın daha iyi bir yolunu bulmak isteyebilirsiniz. –

+0

@Justin: Ben de bunun farkındayım. Ne yazık ki, argüman 'Class' dır ve gereksinim A.class'ın kendisini kontrol etmemesi gerektiğini belirtir. En iyisi 'A' 'yi soyutlamak ve strateji modelini uygulamak olacaktır, fakat bu,' A 'argümanının bir' somut 'örneğini gerektirir,' Sınıf '. OP'nin tasarımının kalanını nasıl etkileyeceğinden emin değilim. Belki de OP'nin argüman olarak 'Class'ı seçmek için kendi geçerli nedenleri vardır. Daha iyi tasarım önerileri vermeden önce fonksiyonel gereksinimin daha fazla açıklığa kavuşturulması gerekmektedir. – BalusC

+0

Bu, gerçek bir iş sistemi veya okul projesi için kullanılıyor mu? –

5

Evet, Class.getSuperclass() tam olarak ihtiyacınız olan şeydir.

Class<?> c = obj.getClass(); 
System.out.println(c.getSuperclass() == Some.class); 
+0

== veya eşittir (sınıf nesneleri için farketmez) ister misiniz? –

+2

ve E sınıfı için ağacı tekrarlamak zorunda mıyım? –

+2

@sprocketonline - Evet. – Jeremy

8

Sen tür denetlemesi önlemek ve bunun yerine, ne istersen yap A ve D versiyonları hiçbir şey varsa B, C ve E fonksiyonlarını uygulamak ve sonra doSomething sınıf içinde bu işlevi çağırmak için çalışmalısınız.

Yazım denetimi yaparsanız, çok yeni bir sınıf eklediğinizde, koşullu mantığı değiştirmeniz gerektiğinden çok bakım gerektirmez.

Bu sorun, sınıfların ve geçersiz kılmaların önlenmesi için var.

0

, siz (yukarı Java 5 ve üzeri) Genellemelere kullanabilirsiniz:

public void myFunc(Class<? extends A> cls) { 
} 

A'dan miras herhangi Class'ta bir derleme zamanı hatası oluşturur geçirilmesi.

İlgili konular