Vererbung, ersetzbarkeit

hallo!

stehe gerade vor einem Problem…

habe ein interface

dieses interface wird von der klasse A implementiert und von der klasse B. der unterschied zwischen diesen klassen besteht darin, dass B eine zusätzliche methode implementiert die im interface nicht verfügbar ist und in A nicht verfügbar sein darf… weiters darf B extends A nicht vererbt werden.

wie kann ich diese eine zusätzliche methode der klasse B zur verfügung stellen ohne, die ersetzbarkeit zu gefährden.

also INterface a = new B() würde gehen nur ohne der zusätzlichen Methode… wie macht man das das bei untertypen alle zusätzlichen methoden zur verfügung stehen?

danke & lg, michael

Hallo,

wie kann ich diese eine zusätzliche methode der klasse B zur
verfügung stellen ohne, die ersetzbarkeit zu gefährden.

was meinst du mit dem Zur-Verfügung-Stellen? Wenn die Klassen A und B beide das Interface implementieren, dann funktioniert sowohl

also Interface a = new B()

als auch

Interface a = new A();

Über die Referenz a kannst du dann natürlich nur Methoden aus dem Interface aufrufen. Aber wenn du speziell mit B-Objekten arbeitest, hast du natürlich Zugang zu allen dort definierten Methoden:

B b = new B();
b.nichtImGemeinsamenInterface();

Viele Grüße,

Andreas

Danke für deine schnelle Antwort…

Aber es muss ja möglichsein Interface i = new B() oder wie wird das mit untertypen gemacht, die zusätzliche funktionen beihnalten…
werden die immer „normal“ instanziert also B b = new B()

sonst wäre es ja nicht ersetzbar oder?

lg, michael

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Michael,

Aber es muss ja möglichsein Interface i = new B()

klar ist das möglich, aber in diesem Fall abstrahierst du ja gerade von den Unterschieden zwischen A und B und beschränkst dich absichtlich auf die gemeinsame Schnittstelle, um Objekte der Klassen A und B gleich behandeln zu können. In diesem Fall sind also sämtliche Spezialitäten der Klasse B nicht sicht- und zugreifbar.

werden die immer „normal“ instanziert also B b = new B()

Moment, die Instanzierung ist dieselbe wie oben (nämlich „new B()“); der Unterschied ist nur der Typ der Variablen, der du das erzeugte Objekt vom Typ B zuweist. Das beides musst du auseinanderhalten: Zuweisen kannst du das Objekt jeder Variablen eines Supertyps von B oder irgendeines Interfaces, das B implementiert. Sobald du das tust, verlierst du bestimmte Dinge, die Bs ausmachen; aber das ist ja erwünscht, weil du so abstrahierst und Bs und As (und Cs …) gleich behandeln kannst (oder die einen durch die anderen ersetzen, ohne dass sich Code ändert).

Viele Grüße,

Andreas

Hi.

Aber es muss ja möglichsein Interface i = new B() oder wie
wird das mit untertypen gemacht, die zusätzliche funktionen
beihnalten…
werden die immer „normal“ instanziert also B b = new B()

Wenn du mit Interface i = new B(); ein Objekt der Klasse B erzeugt hast, kannst du mit i.irgendwas() nur auf die Methoden zugreifen, die auch im Interface sind.
Aber: Du kannst per i instanceof B abfragen, ob dieses i, welches du gerade zur Hand hast, ein B ist, und in dem Fall dann per ((B)i).nurInB() auf die Methoden zugreifen, die nicht im Interface definiert sind.
Das sähe dann ungefähr so aus:

void machWas(Interface i)
{
 if (i instanceof B)
 {
 ((B) i).blablabla();
 }
}

void test()
{
 machWas(new A()); //Hier wird blablabla nicht aufgerufen
 machWas(new B()); //Hier aber doch
}

Sebastian.