Überschreiben mit kontravariante Parameter

CSHW89

Bekanntes Mitglied
Mal ne kleine Frage aus Interesse. Gibt es irgendwelche guten Gründe, warum man beim Überschreiben von Methoden keine kontravarianten Parameter zulässt. Ich meine so etwas:
Java:
class A {
  public void foo(Integer a) {
  }
}
class B extends A {
  @Override
  public void foo(Number a) {
  }
}
Ich hab jetzt nicht unbedingt vor, sowas zu benutzen. In Java wirds das vermutlich auch nie geben, da es sicher zu einigen abwärtskompatiblen Problemen führen würde (siehe Einführung kovariantem Rückgabetyp).
Mich würde es nur interessieren, welche Überlegungen dazu geführt haben, und ob es da große Probleme geben würde, wenn es in einer beliebigen OOP-Sprache vorhanden wäre. Hab da schon ein bisschen gegooglet, aber keine gravierenden Gründe gefunden, die dagegen sprechen. Ein Fall war z.b.:
Java:
class A {
  public void foo(Integer a) {
  }
  public void foo(Double a) {
  }
}
class B extends A {
  @Override
  public void foo(Number a) {
  }
}
Die Frage ist, welche Methode überschreibt nun die Methode aus B. Da sehe ich aber z.b. kein Grund, warum die Methode nicht beide überschreibt.

Würde mich über ein paar Gedanken freuen.

lg Kevin
 
Moin,

ich denke: weder noch ...

http://openbook.rheinwerk-verlag.de...05_010.htm#mj530675a29a46e99d1439817af2844707
Abschnitt 5.10.1
Besitzt eine Unterklasse eine Methode mit dem gleichen Methodennamen und der exakten Parameterliste (also der gleichen Signatur) wie schon die Oberklasse, so überschreibt die Unterklasse die Methode der Oberklasse
und exakt gleich sind Deine Signaturen ja nun nicht 😉

Und zwei verschiedene Methode gleichzeitig mit EINER zu überschreiben, geht nun mal sowie nicht (aus dem gleichen Grund) !!

EDIT: https://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6621-Ueberschreiben-von-Methoden.html

Gruß Klaus
 
Moin,

ich denke: weder noch ...

http://openbook.rheinwerk-verlag.de...05_010.htm#mj530675a29a46e99d1439817af2844707

und exakt gleich sind Deine Signaturen ja nun nicht 😉

Und zwei verschiedene Methode gleichzeitig mit EINER zu überschreiben, geht nun mal sowie nicht (aus dem gleichen Grund) !!

EDIT: https://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6621-Ueberschreiben-von-Methoden.html

Gruß Klaus
Das es nicht geht, ist klar, die Frage ist auch, was dagegen spricht, das zu ermöglichen 😉


Ist nicht nötig, da ziemlich leicht anders umzusetzen, bringt aber nur recht viel Komplexität mit.
 
die Frage ist auch, was dagegen spricht, das zu ermöglichen
Weil das doch wohl dem Sinn der Vererbung widersprechen und den Compiler unnütz verwirren würde 😎

Nur wenn eine Methode formal gleich ist (Name, Signatur, Rückgabewert) ist sie auch überschreibbar!
Deswegen überschreibt auch eine Methode genau EINE Methode - nicht mehr und nicht weniger ...

Gruß Klaus
 
Streng genommen: weder noch 🙂
Das liegt eher am Compiler und der dahinterliegen Grammatik (ok, somit natürlich auch an der Sprache)!

Du musst Dir mal klar machen, was Überschrieben (im Sinne der OOP) bedeutet!!

Du erweiterst die Methode der Oberklasse um eine neue/andere Funktionalität!
Aber der formale Aufbau (eben Name, Signatur, Rückgabewert) muss halt gleich sein, da es ja anderfalls weine komplette andere Methode wäre ...
https://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6621-Ueberschreiben-von-Methoden.html

Gruß Klaus
 
Und warum sollte es nicht denkbar sein dass eine Methode gleichzeitig zwei der Superklasse überschreibt ?
na, weil dann beide Methode in der Oberklasse im formalen Aufbau (Name, Signatur, Rückgabewert) identisch sein müssten ... und genau das kann der Compiler logischerweise nicht gut verknusen 😎
Die Eindeutigkeit wäre dann ja verloren gegangen ... 🙄
 
Streng genommen: weder noch 🙂
Das liegt eher am Compiler und der dahinterliegen Grammatik (ok, somit natürlich auch an der Sprache)!

Du musst Dir mal klar machen, was Überschrieben (im Sinne der OOP) bedeutet!!

Du erweiterst die Methode der Oberklasse um eine neue/andere Funktionalität!
Aber der formale Aufbau (eben Name, Signatur, Rückgabewert) muss halt gleich sein, da es ja anderfalls weine komplette andere Methode wäre ...
https://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6621-Ueberschreiben-von-Methoden.html

Gruß Klaus
Das ist ein im Kreis drehen 😉
Es ist eine komplett andere Methode, weil DIE SPACHE vorgibt, dass es kein Überschreiben ist. Würde die Sprache das ermöglich, wäre es eben keine andere Methode, sondern es würden die ursprünglichen überschrieben werden.

Bei Mehrfachvererbung ist es doch genauso, es ist nicht möglich, weil es so vorgegeben ist, und jede Definition (für Java) wird das auch sinnvoll begründen. Das es trotzdem möglich ist, zeigen andere Sprachen


Es würde aber vermutlich mehr Probleme für Programmierer und Compiler verursachen, als es löst.
 
weil dann beide Methode in der Oberklasse im formalen Aufbau (Name, Signatur, Rückgabewert) identisch sein müssten
Ja weil der Compiler bzw. die Sprache Java so sagen. Aber es ist auch durchaus anders denkbar. Begründe mal warum Name, Signatur und Rückgabewert identisch sein müssen ? Damit der Compiler erkennen kann dass es sich um ein überschreiben handelt oder ?

Edit: ok, ich schliesse mich da meinem Vorredner an
 
Rückgabetyp kann aber seit Java 5 kovariant sein. Nach deine Argumentation @VfL_Freak wäre das auch nicht sinnig. Gründe gegen kontravariante Parameter konnte hier aber noch keiner nennen, außer dass Java es z.z. nicht erlaubt.
 

Zurück
Oben