2010-04-23 14 views
9

Jeśli mam klasę bazową z których Base thing = null; tam jest podklasą class Subclass extends Base i prowokować go jako thing = new Subclass jak nazwałbym metodę, która jest specjalnie w podklasie, ale nie w bazie? np. Base ma tylko method() Subclass został method() i specialMethod() metoda specialMethod() jest jeden chcę zadzwonić.Wywołanie metody podklasy w Javie

+2

To generalnie zły pomysł. Jeśli wiesz, że obiekt jest typu Subklasa, to odnieś go do tego i nie masz problemu. Jeśli metoda naprawdę należy do Base - umieść ją w Base. –

Odpowiedz

12

Jeśli wiesz, że thing zawiera Subclass można zrobić:

((Subclass) thing).specialMethod() 
+6

Zauważ, że jeśli coś nie jest "podklasą", będzie bombardować 'ClassCastException' ... użyj' instanceof', aby sprawdzić, czy 'rzecz' jest' Subklasą ', jeśli nie jesteś pewien. – Powerlord

1

należy wpisać lub oddania rzeczy do podklasy. Więc:

 Subclass thing = new Subclass(); 

czyli

 ((Subclass) thing).specialMethod(); 
7

Trzeba cast to, aby móc wywołać metodę:

Base thing = new SubClass(); 

((SubClass) thing).specialMethod(); 

jeśli obliczu tej sytuacji, najprawdopodobniej nie robić mieć odpowiedni interfejs (odpowiedni zestaw metod)

Zanim przejdziesz w głąb sceny rozpoczęciem sprawdzania wszystko, aby wiedzieć, czy można wywołać metodę lub nie podoba w:

public void x (Base thing) { 
    if(thing.instanceof Subclass) { 
     ((SubClass)thing).specialMethod(); 
    } 
} 

rozważenia, jeśli nie trzeba przesunąć specialMethod w hierarchii tak należy do podstawy.

Jeśli zdecydowanie nie trzeba go w bazie, ale trzeba go w podklasie przynajmniej rozważyć używać odpowiedniego typu:

SubClass thing = ... 
// no need to cast 
thing.specialMethod(); 

Ale jak zawsze, to zależy od tego, co starasz się zrobić.

+0

To stwierdzenie "jeśli" powinno prawdopodobnie mieć "inny" ... –

3

Gdy mamy do czynienia ze spadków/polimorfizmu w Javie istnieją zasadniczo dwa rodzaje odlewów, które można zobaczyć:

Upcasting:

Superclass x = new Subclass(); 

To jest niejawny i nie wymaga twardego obsady, ponieważ Java wie, że wszystko, co może zrobić Superclass, może również zrobić.

rzutowanie w dół

Superclass x = new Subclass(); 

Subclass y = (Subclass) x; 

W tym przypadku trzeba zrobić twardy obsady, ponieważ Java nie jest pewien, czy to będzie działać czy nie. Musisz go pocieszyć, mówiąc, że wiesz, co robisz. Powodem tego jest to, że podklasa może mieć kilka dziwnych metod, których nie ma nadklasa.

Ogólnie rzecz biorąc, jeśli chcesz utworzyć instancję klasy w celu wywołania czegoś w jej podklasie, powinieneś po prostu utworzyć instancję podklas na samym początku - lub określić, czy metoda powinna znajdować się również w klasie nadrzędnej.

16

Inni już wspomnieli, jak rzutować obiekty, aby uzyskać odpowiedź na swoje pytanie, ale zadając to pytanie na pierwszym miejscu, wskazuje na możliwy problem projektowy. Możliwe przyczyny:

+1

po prostu zmienić go na "możliwy problem projektowy" i całkowicie się zgadzam. – David

0

Innym rozwiązaniem może być wykonanie następujących czynności:

public abstract class Base { 

    //method() not implemented 

    public abstract void specialMethod(); 
} 

public class Subclass extends Base { 

    //method() not implemented 

    @Override 
    public void specialMethod() { 
     //put your code here 
     System.out.println("specialMethod from Subclass"); 
    } 
} 

Więc można zrobić:

thing.specialMethod(); 

i to daje: "specialMethod z Podklasa".

Powiązane problemy