2010-03-12 12 views
5

Ich habe ein Objekt einer Unterklasse erweitert seine Oberklasse. In der Unterklasse gibt es eine überschriebene Methode, die mit dem Objekt aufgerufen werden kann. Ist es möglich, die Funktion der Superklasse mit dem Unterklassenobjekt aufzurufen?Zugriff auf Super-Klasse-Funktion mit Subclass-Objekt

package supercall; 

public class Main { 

    public static void main(String[] args) { 
     SomeClass obj = new SubClass(); 
     obj.go(); //is there anything like, obj.super.go()? 
    } 

} 

class SomeClass { 
    SomeClass() { 

    } 
    public void go() { 
     System.out.println("Someclass go"); 
    } 
} 

class SubClass extends SomeClass { 
    SubClass() { 

    } 
    @Override 
    public void go() { 
     System.out.println("Subclass go"); 
    } 
} 

Betrachten Sie den obigen Code.

Hier druckt es

Subclass gehen

. Stattdessen habe ich

Superklasse

gehen

zu drucken.

Antwort

15

Nein, es ist nicht möglich, und wenn Sie denken, dass Sie es brauchen, überdenken Sie Ihr Design. Der einzige Zweck einer Methode besteht darin, ihre Funktionalität zu ersetzen. Wenn eine andere Klasse so viel über die internen Abläufe dieser Klasse weiß, wird die Kapselung vollständig aufgehoben.

2

Statt:

System.out.println("Subclass go"); 

schreiben

super.go(); 

(Oder Sie wissen, nur nicht implementieren diese Methode ...).

+0

Ja. Aber manchmal würde ich auch die Methode der Unterklasse verwenden. Ist es nicht möglich, die Methode der Oberklasse auf andere Weise aufzurufen? etwas wie obj.super.go() ??? Natürlich ist das ein falsches Konstrukt. Ich meinte sowas ähnliches ?? – bdhar

+0

Oh Mann ... ich habe gerade diese Antwort geschrieben (nicht gepostet) ... Scheiße !!! – RubyDubee

+1

@bdhar: Ja, du kannst einfach 'Super' nennen. Aber Sie müssen diesen Anruf von * in * der Klasse tätigen. Es kann nicht extern gemacht werden. –

0

Gibt es eine Möglichkeit, dies zu erreichen? Nein, da ist es nicht.

Zur Laufzeit wählt die JVM die aufzurufenden Methoden basierend auf dem Instanztyp (das ist Polymorphismus für Sie), nicht basierend auf dem Typ, mit dem sie deklariert wird.

Ihre Instanz ist eine Unterklasseninstanz, daher wird die Methode go() in der Unterklasse aufgerufen.

0

Ein Weg wäre, die Unterklasse die Implementierung der Superklassen aufzurufen. Aber ich nehme an das ist nicht was du willst?

class SubClass extends SomeClass {  
SubClass() {}  
    @Override  
    public void go() {  
     super.go 
    } 
} 
+0

@Steve .. Aufruf Superklasse Funktion mit Super Stichwort ist in der Tat der richtige Weg. Was ich wissen wollte, war, ob es eine andere Möglichkeit gibt, die superclass go() -Methode mit "obj" als Referenz aufzurufen ?? –

3

Hier wird gedruckt Unterklasse gehen . Stattdessen muss ich drucken

In Ordnung, dann nicht überschreiben gehen Methode @ Subklasse, wird es Superklasse Implementierung aufrufen.

Wenn Sie Superimplementierung ausführen möchten und zusätzlichen Code @ subclass haben, rufen Sie super.go(); und dann einige andere Anweisungen ausführen.

Es ist in Ordnung, da Sie bereits geschriebenen Code wiederverwenden, sollten Sie Code nicht aus der Superklasse kopieren und in Subs einfügen, da es sich um Codeverdopplung handelt. Aber wenn dein Ziel ist, das Verhalten vollständig zu ändern, dann rufe nicht Super