Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class

brandt

Mitglied
Hallo,

Als Aufgabe zum Thema Vererbung etc. sollen wir ein elektrisches Widerstandsnetzwerk aufbauen. Dabei gibt es eine Klasse "SimpleResistor", deren Objekte jeweils einen Widerstand darstellen sollen und es gibt die Klasse "AbstractResistorNet", dessen Erben "Serial" und "Parallel" eben den Gesamtwiderstand eines aus zwei (als Parameter übergebenen) Widerständen bestehenden Netzwerks ausrechnen soll. Die beiden Widerstände kommen entweder direkt von einem SimpleResistor-Objekt, oder eben von einem bereits berechneten Teilnetzwerk ("Serial" oder "Parallel"), natürlich dann auch ein Objekt, oder aus einer Mischung aus einem SimpleResistor und einem Teilnetzwerks.
Soweit so gut, bis hier hin funktioniert alles!
Jetzt zum eigentlichen Problem:
Ich soll in der nächsten Aufgabe über das Interface, welches die Schnittstellen aller genannten Klassen vorschreibt, die Methode "int resistor()" deklarieren, welche die Anzahl der vorhandenen Widerstände ausgeben soll und soll mir hier auch überlegen, in Welchen Klassen ich diese Methode implementieren soll.
Am meisten Sinn macht für mich, diese in "Serial" und "Parallel" zu machen, wenn ich irgendwie untersuchen könnte, woher die Parameter für "Serial" oder "Parallel" kommen, da diese ja entweder, wie bereits geschrieben, aus einer Getter-Funktion eines älteren Teilnetzwerkes kommen, oder aus einem einzelnen Widerstand. Geht das und wenn ja wie? Oder hast du vielleicht eine andere Idee?

Liebe Grüße,
Brandt
 
Wenn ich dich richtig verstanden habe, sieht deine Vererbungshierarchie folgendermaßen aus:
Code:
           Resistor
              ^
              |
     /-------------------\
     |                   |
SimpleResistor   AbstractResistorNet
                    ^          ^
                    |          |
                  Serial    Parallel
Wenn dem so ist, würde ich Resistor.resistor() implementieren in:
- SimpleResistor
- AbstractResistorNet

Wenn AbstractResistorNet wirklich nur eine Aggregation aus zwei anderen Resistor Instanzen ist, dann ist doch die Implementierung der Resistor.resistor() Methode in AbstractResistorNet ziemlich einfach: return erster.resistor() + zweiter.resistor(); Wie viele Widerstände dann nun in diesen zwei Widerstandsnetzwerken drin sind, wird doch dann einfach per Methodenaufruf/Delegation an diese Instanzen abgefragt.
Serial und Parallel erben ja von AbstractResistorNet, und enthalten keine weiteren wichtigen Informationen mehr, also musst du hier Resistor.resistor() doch gar nicht implementieren.
 
Vielen Dank für schnelle Antwort!
Ja die Hierarchie ist richtig, allerdings verstehe ich den Rest nicht ganz. Mit erster.resistor() willst du die Methode des ersten Widerstands Resistor aufrufen? Aber was bringt mir das? Bzw. wie müssten die Methode resistor() dann aussehen?
Ich will ja, die Gesamtanzahl der der Widerstände haben. Dass heißt, wenn ich ein Widerstandsnetz aus z.B. 6 Widerständen simulieren will, muss ich 6 Widerstandsobjekte erstellen und eben mehrere "Serial" und "Parallel"-Instanzen, ich erstelle aber keine AbstractResistorNet-Instanz. Ich verstehe wirklich nicht wie ich hier vorgehen soll...
 
Ich denke, ein wichtiger Meilenstein im Verständnis hiervon, ist "(Single) Dynamic Dispatch". Deine Übung vereint eigentlich mehrere Aspekte:
- Single Dynamic Dispatch
- Vererbung
- und auch Rekursion
Wichtig zu realisieren ist, dass ein Aufruf von erster.resistor() nun vom konkreten Laufzeittyp des Objektes abhängt, das in erster gespeichert ist. Wenn es ein SimpleResistor war, wird dessen resistor() Methode aufgerufen, die natürlich einfach 1 zuruckliefert. War es aber ein Serial oder Parallel, so wird die Methode AbstractResistorNet.resistor() aufgerufen, und die Rekursion geht weiter mit dem ersten und zweiten Widerstand davon, bis irgendwann nur noch SimpleResistor Instanzen übrigbleiben und die Rekursion beendet wird.
 
Vielen Dank für die Hilfe. Ich hab meinen Denkfehler gefunden. Ich hab nicht verstanden, dass das Interface auch gleichzeitig die Superklasse von AbstractResistorNet und von SimpleResistor ist. Jetzt übergebe ich einfach die Variable vom Typ Resistor und alles klappt. Ohne diese gemeinsame Superklasse, konnte ich mir einfach nicht vorstellen wie es geht... Also vielen Dank für die schnelle und hilfreiche Antwort!!
 

Zurück
Oben