Vererbung (wie) kann man eine 'super'-Methode auf ein Objekt anwenden ?

Hallo Forum,
ich hätte eine Frage, wo ich absolut keine Lösung finden konnte....

Kann man auf ein Objekt einer Subklasse die original Methode einer überschriebenen Methode anweden?

Ich habe ein Beispiel nachprogrammiert, wo eine Klasse die Methode gehaltErhoehen(...) hat.
Eine zweite Klasse erbt von dieser ersten Klasse, dabei wird allerdings die Methode gehaltErhoehen(...) überschrieben.

In der main wird ja nun auf ein Objekt der Subklasse die überschriebene Methode angwendet.
Gibt es eine Möglichkeit, trotzdem die original Methode auf das Objekt (aus der Subklasse) anzuwenden?

<Objektname>.super.gehaltErhoehen(...);
funktioniert leider nicht...


Ich weiß, es macht nicht unbedingt Sinn, diesen Schritt zu machen. Es interessiert mich aber allgemein, ob das möglich ist.

Danke für jede Art von Hilfestellung!
 
Also so ein Aufruf sollte über Reflection möglich sein indem du MethodHandle nutzt.

Ansonsten widerspricht es der objektorientierten Logik so dass dies schlicht nicht möglich ist!

Das wäre nur eine Aktion, die im Rahmen der Erstellung einer Unterklasse Sinn machen könnte. Also wenn Du nun von der Klasse ableitest, dann könntest Du jetzt sozusagen von der Superklasse der Superklasse die Funktion aufrufen wollen.
Dies geht dann über ein cast von this. Also sozusagen ((SuperSuperClass)this).methodCall();

Dies findet sich in der Java Language Specification:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.11.2
(Incl. Beispiel mit Interface und mehreren Klassen)

ABER: Ich habe sowas ehrlich gesagt bisher nicht gesehen und das ist in meinen Augen recht dubios. Scheint mir ein Fall für ein sehr schlechtes objektorientiertes Design zu sein. Aber ich möchte natürlich nicht ausschließen, dass es doch Situationen gibt, bei denen das sinnvoll sein könnte.

Konrad
 
Ich geh mal davon aus das du nur in Bestimmen Situationen die super.gehaltErhoehen() brauchst, denn wenn du sie immer brauchen würdest hättest du nicht die Methode überschrieben. Von daher würde ich die eher zu einem if else Konstrukt in der abgeleiteten Klasse raten.
Java:
if(whatever) {
  super.erhoeheGehlat();
} else {
  //do something
}

Das ist nachher auch um einiges besser zu warten ;-)
 
Elenteria hat es schon gezeigt.
Innerhalb der Subklasse kannst du mittels "super.[methodenamen](...)" die überschriebene Methode trotzdem noch aufrufen (das ist auch explizit gewünscht um doppelten Code zu vermeiden).
Das du wie in deinem Beispiel von einer Variable direkt die überschriebene Methode aufrufst geht nicht.
 
Joose: Dafür dass es nicht geht, geht es doch relativ gut:

Code:
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

public class Test  {
    public static void main(String[] args) throws Throwable {
        MethodHandle h1 = MethodHandles.lookup().findSpecial(Test.class, "toString",
                MethodType.methodType(String.class),
                Test.class);
        MethodHandle h2 = MethodHandles.lookup().findSpecial(Object.class, "toString",
                MethodType.methodType(String.class),
                Test.class);
        System.out.println(h1.invoke(new Test()));   // outputs Test Output
        System.out.println(h2.invoke(new Test()));   // outputs Test@860d49
    }

    @Override
    public String toString() {
        return "Test Output";
    }
}
 
Gut an Reflection habe ich in diesem Fall nicht gedacht. Das "es nicht geht" (mittels super) wahr eher auf die gewünschte Schreibweise vom TO bezogen

Folgender Code geht eben nicht 😉
Java:
Hund h = new Hund(...);
h.super.gibLaut();
(wobei Hund von Tier ableitet)
 

Zurück
Oben