Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich hab eine Frage zu Interfaces.
Ich hab ein InterfaceA und ein InterfaceB und eine Klasse ClassAB, die beide Interfaces implementiert.
Was passiert dann, wenn InterfaceA und InterfaceB eine Methode mit gleichem Namen und gleicher Signatur vorgeben?
einfach ausprobieren... Was erwartest Du, dass passieren soll?
Ein Interface gibt nur vor welche Methoden implementiert werden müssen - und nicht wie.
Daher stellt dieser Fall kein Problem dar: Beide Interfaces sind zufrieden, wenn die Methode in ClassAB implemtiert wurde.
Was soll schon passieren? ClassAB muss diese Methode implementieren. Und da es sich um die selben Signaturen handelt und es ferner nicht anders geht, sind die Vorgaben beider Interfaces erfüllt, wenn ClassAB diese Methode genau nur einmal implementiert. Wenn z.B. InterfaceA nur Methoden hat, welche auch in InterfaceB vorkommen, wäre es sinnvoller, wenn InterfaceB InterfaceA erweitert, statt die Methoden in InterfaceB neu zu definieren.
Java:
public interface InterfaceA
{
methodeA(Parameter par);
methodeB(Parameter par);
}
public interface InterfaceB
{
methodeA(Parameter par);
methodeB(Parameter par);
methodeC(Parameter par);
}
wird zu
Java:
public interface InterfaceA
{
methodeA(Parameter par);
methodeB(Parameter par);
}
public interface InterfaceB
extends InterfaceA
{
methodeC(Parameter par);
}
ClassAB müsste nun nur noch InterfaceB implementieren, um auch eine Instanz von InterfaceA zu werden.
@Edit: Zwar wieder viel zu langsam, dafür aber ausführlich
Natürlich ist das technisch gesehen richtig, aber ein Interface schreibt ja einen bestimmten Vertrag vor. Der steht eben nur im JavaDoc, weil er sich so schlecht formalisieren lässt (keine Ahnung, ob das in anderen Sprachen geht, in Java ist mir nichts bekannt). Hat die Methode in den beiden Interfaces sich widersprechende Verträge, kann es keine sinnvolle Klasse geben, die beide Interfaces implementiert.
naja, das Problem ist, dass ich diese Architektur nicht selbst gemacht hab, und ich daran nichts ändern kann, sollte...
Was mein Problem war:
Ich hatte InterfaceA und InterfaceB, beide werden von ClassAB implementiert.
Wenn jetzt irgendeine Methode auf ClassAB aufgerufen wird, wollte ich herausfinden können, von welchem Interface die Methode vorgegeben wurde. Als Ergebnis hätte nur eines der beiden Interfaces herauskommen dürfen, da ich aufgrund dessen wieder unterscheidungen treffen müsste...
Hat sich aber jetzt schon erledigt, es dürfen in korrespondierenden Interfaces einfach keine identischen Methoden vorgegeben werden, basta.
Trotzdem danke für die Anregungen, hab ich schon wieder was gelern
Ich hatte InterfaceA und InterfaceB, beide werden von ClassAB implementiert.
Wenn jetzt irgendeine Methode auf ClassAB aufgerufen wird, wollte ich herausfinden können, von welchem Interface die Methode vorgegeben wurde. Als Ergebnis hätte nur eines der beiden Interfaces herauskommen dürfen, da ich aufgrund dessen wieder unterscheidungen treffen müsste...
"Anti-OO" Programmierung mit einer OO Sprache vielleicht?
andkul,
wenn man Polymorphy nutzt will man eigentlich nicht wissen welches Objekt die Methoden eines Interfaces implementiert hat, sonst würde man sich die Polymorphy gleich sparen
Na da wäre ich auch mal auf den Usecase gespannt. Für mich hört sich das so an, als solle in der konkreten Klasse unterschieden werden, zu welchem Interface die aufgerufene Methode gehört???:L. Aber:
1. So etwas weis man als Entwickler doch von vorneherein, wenn man ein Interface implementiert.
2. Wollte man trotzdem zwischen Methoden gleicher Signatur in der konkreten Klasse unterscheiden, muss das ein zwangläufig Design-Fehler sein (InterfaceA-Methode soll etwas anderes als InterfaceB-Methode machen), weil mindestens ein Interface zuviel implementiert wurde, welches deswegen in eine eigene konkrete Klasse gehört.