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.
Aufgabe:
Definieren Sie eine abstrakte Basisklasse Net für Widerstandsnetze mit einem Datenelement
resistors vom Typ java.util.TreeSet, das die eindeutigen Namen (ID) aller
im Netz vorkommenden Widerstande als Strings enthalt.
Ferner gibt es
(a) eine abstrakte Methode ohm() mit Rückgabetyp double, das den Gesamtwiderstand
des Netzes zurückgibt;
(b) eine implementierte Methode show(), die die Menge resistors mit einer foreach-
Schleife durchläuft und alle IDs der Widerstände im Netz als String zurückgibt.
Frage: Wenn ich den TreeSet in Net implementiere, dann kann ich in einer Testklasse nicht mehr darauf zugreifen, bzw. Werte einfügen, auslesen und so weiter.
Bedeutet das, dass man nur in der Klasse wo man den Tree implementiert hat auf diesen zugreifen kann?
Du kannst die notwendigen Methoden delegieren. Das ist ganz simpel:
Java:
public class Net {
private final TreeSet<String> resistors;
public Net() {
this.resistors = new TreeSet<String>();
}
// delegate TreeSet#add
public boolean addResistor(String resistor) {
return this.resistors.add(resistor);
}
...
}
So ist es indirekt möglich die Methoden des TreeSet zu kapseln und nur notwendiges nach außen verfügbar zu machen..
Es kommt darauf an, welchen Modifier zu verwendest (keinen, public, protected, private).
Mach es am besten so, wie es Oneixee5 gezeigt hat: Speichere es in einer private Variable und und sprich es über Methoden an, die auch extern zugänglich sind (package protected, protected oder public).
public abstract class Net {
private final TreeSet<String> resistors;
public Net() {
this.resistors = new TreeSet<String>();
}
public boolean addResistor(final String resistor) {
return this.resistors.add(resistor);
}
public abstract double getAggregatedResistance();
}
Man kann mit einem kleinen Trick - Fake-Implementierung - das Ganze aus einer Main-Methode testen.
Java:
public class App {
public static void main(String[] args) {
Net net = new Net() {
@Override
public double getAggregatedResistance() {
// TODO Auto-generated method stub
return 0;
}
};
net.addResistor("666");
}
}
Dein Aufgabentext lässt einige Fragen offen. Es ist zu vermuten, dass das Ganze so gedacht ist, dass die abstrakten Methoden in einer abgeleiteten Klasse umzusetzen ist. Ansonsten bräuchtest du für a) ja nur den Header zu definieren und den Aufgabentext in die Dokumentation kopieren.
b) hingegen wird in der Klasse Net implementiert.
Damit deine abgeleitete Klasse das Treeset nutzen kann, müssen entweder das Treeset selbst (nicht zu empfehlen) oder die Zufriffsmethoden zumindest "protected" sein.
Damit deine abgeleitete Klasse das Treeset nutzen kann, müssen entweder das Treeset selbst (nicht zu empfehlen) oder die Zufriffsmethoden zumindest "protected" sein.
Da muss ich widersprechen. Man sollte das TreeSet evtl. besonders schützen, damit der ursprüngliche Sinn des TreeSet auch nach der Implementierung erhalten bleibt.
Java:
public abstract class Net {
private final TreeSet<String> resistors;
public Net() {
this.resistors = new TreeSet<String>();
}
public final boolean addResistor(final String resistor) {
return this.resistors.add(resistor);
}
public abstract double getAggregatedResistance();
}
Die implementierende Klasse kann jetzt auf addResistor zugreifen aber nicht überschreiben.
Java:
public class NetImpl extends Net {
@Override
public double getAggregatedResistance() {
return 0;
}
public static void main(String[] args) {
NetImpl impl = new NetImpl();
impl.addResistor("666");
}
}
Will man weitere Möglichkeiten haben auf das TreeSet zuzugreifen, kann man in Net weitere Delegate-Methoden anlegen.
Java:
public final Iterator<String> iterator() {
return this.resistors.iterator();
}
So ist sichergestellt, dass bei der Implementierung nicht einfach jemand this.resistors durch eine andere Instanz oder null ersetzen kann und die Delegate-Methoden können nicht einfach irgendwie "verbogen" werden.
Da muss ich widersprechen. Man sollte das TreeSet evtl. besonders schützen, damit der ursprüngliche Sinn des TreeSet auch nach der Implementierung erhalten bleibt.
Genau das sollte "nicht zu empfehlen" auch heißen. Damit die abgeleitete Klasse irgendwie darauf zugreifen kann, muss die Zugriffsmethode schon mindestens protected sein. Ist sie private, kann die abgeleitete Klasse nicht darauf zugreifen.
Ich denke, wir meinen schon das Selbe.
Sofern nicht irgend jemand anderes als eine abgeleitete Klasse darauf zugreifen muss, reicht protected, package protected und public wären dafür nicht notwendig.