2016-06-05 12 views
0

Ich habe eine Frage zu Vererbung und Bindung.Java-Superklasse Aufruf einer Methode in einer Unterklasse erstellt

Was passiert, wenn ich eine neue Methode in einer Unterklasse erstelle und versuche, sie mit der Oberklassenreferenz aufzurufen?

Ich weiß, dass es zuerst den Typ und danach das Objekt überprüfen wird. Also nach den Regeln wird das nicht funktionieren, weil diese Methode nicht in der Oberklasse deklariert ist.

Aber gibt es keine Möglichkeit, es zu überwinden?

Ich meine bedeutet Vererbung bedeuten, dass Sie jede einzelne Methode in der Oberklasse deklarieren müssen, und wenn Sie etwas für Unterklasse ändern möchten, können Sie es nur außer Kraft setzen? Also, wenn ich plötzlich merke, dass eine meiner Unterklassen eine spezielle Methode benötigt, oder eine Überladung benötigt, dann muss ich sie entweder zuerst in der Oberklasse deklarieren oder gar vergessen?

+3

Selbst wenn dies möglich wäre, sollte es nie gemacht werden. Eine Superklasse sollte keine Wissensanforderung für ihre Kinder haben. –

+1

Re '" Aber gibt es keine Möglichkeit, es zu überwinden? "" - es gibt nichts zu überwinden, da dies nie getan werden sollte. Erwägen Sie, die zugrunde liegende Motivation für diese Frage zu veröffentlichen, da Ihre Frage tatsächlich ein [XY-Problem] (http://mywiki.wooledge.org/XyProblem) ist, in dem Sie fragen, "wie behebe ich dieses Codeproblem", wenn die beste Lösung ist einen gänzlich anderen Ansatz zu verwenden. Denken Sie daran, uns das Gesamtproblem zu nennen, das Sie lösen möchten, und nicht, wie Sie es gerade lösen wollen. –

+0

Was würden Sie erwarten, wenn Sie die Methode in einer Instanz der Superklasse aufrufen, die * nicht * eine Instanz der Unterklasse ist, die die Methode deklariert? –

Antwort

1

Also, wenn ich plötzlich erkennen, dass einer meiner Subklassen eine spezielle Methode nicht braucht, oder eine Überlastung muss, dann eather ich es in Super zuerst erklären gezwungen oder darüber überhaupt vergessen?

Es gibt eine dritte Option. Deklarieren Sie die Methode in der Unterklasse. Codieren Sie in Code, der die Methode aufrufen muss, den Verweis auf den Unterklasse-Typ. Wenn die Referenz nicht wirklich auf ein Objekt dieser Unterklasse verweist, erhalten Sie eine ClassCastException.

Wenn Sie so etwas machen müssen, sollten Sie es während Ihres nächsten Refactoring-Passes noch einmal anschauen, um zu sehen, ob es geglättet werden kann.

public class Test { 
    public static void main(String[] args) { 
    System.out.println(new Test().toString()); 
    Test sub = new TestSub(); 
    System.out.println(sub.toString()); 
    ((TestSub)sub).specialMethod(); 
    } 

    @Override 
    public String toString(){ 
    return "I'm a Test"; 
    } 
} 

class TestSub extends Test { 
    void specialMethod() { 
    System.out.println("I'm a TestSub"); 
    } 
} 
+0

'" ... um zu sehen, ob es geglättet werden kann. "' - Wie würdest du es glätten? Besucher Entwurfsmuster? Oder ist das eine zu weite Frage? Danke wie immer. –

+0

@HovercraftFullOfEels Ich kenne keine Einheitslösung. Während des Refactorings würde ich den allgemeinen Bereich überprüfen, um zu sehen, ob es eine glatte Möglichkeit gibt, den Cast zu vermeiden. –

0

eine abstrakte Methode in der Superklasse erstellen (und die Super zu einer abstrakten Klasse ändern), dann die abstrakte Methode in der Superklasse aufrufen.

0

Um auf DwB Antwort zu erweitern: Erstellen Sie eine Standard-No-Op-Methode.

public class Super { 
    public void special() { 
     // no-op 
    } 
} 

public class Sub extends Super { 
    @Override public void special() { 
     System.out.println("Now I do something"); 
    } 
} 
Verwandte Themen