Eine Klasse oder Interface konstruieren |
15.11.2014, 16:50 | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Haevelin | Eine Klasse oder Interface konstruieren Folgende Aufgabe habe ich zu bearbeiten: Gegeben sei die Implementierung der Klasse Nutzer, die unter anderem die Klassen K1 und K2 des Pakets paketB nutzt. Um paketB einfacher ändern zu können, soll nur noch eine Klasse (oder Schnittstelle) Z nach außen angeboten werden. Dazu müssen im Code von Nutzer alle Typen K1 und K2 durch Z ersetzt werden. Schreiben Sie den vollständigen Code von Z so, dass sich die geänderte Implementierung von Nutzer genauso wie die alte verhält. Z soll natürlich K1 und K2 nutzen. package paketA; import package paketB.*; public class Nutzer { private K1 k1; private K2 k2; private int wert; public Nutzer (K1 k1, K2 k2, int wert){ this.k1=k1; this.k2=k2; this.wert=wert; } public void aendern(int x){ if (k1.pruefen(x)){ this.wert=x; k1.protokollieren(); } } public void analysieren(double x){ if (k2.pruefen(x)){ wert+=k2.berechnen(x); k1.protokollieren(); } } } Meine Idee ist zunächst die gewesen in Z den Umstand zu nutzen, dass K2 über ein double pruefen(x) aufruft, und K1 die gleiche Funktion über ein int. Weiter bin ich noch nicht gekommen. |
||||||||||||||||||||
|
|||||||||||||||||||||
16.11.2014, 11:19 | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Haevelin | RE: Eine Klasse oder Interface konstruieren Einen Ansatz habe ich jetzt so: public class Z { private K1 k1; private K2 k2; int wert; double dwert; public Z(K1 k1, int wert){ this.k1=k1; this.wert=wert; } public Z(K2 k2, double dwert){ this.k2=k2; this.dwert=dwert; } } Irgendwie muss die Klasse Nutzer wissen, welches Z sie anlegt, d.h. auf welchen Konstruktor sie reagieren soll. Mir ist aber nicht klar, wie das der Klasse Z mitgeteilt wird. |
||||||||||||||||||||
16.11.2014, 15:58 | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Karlito | Hallo Haevelin, das Problem ist u.A., dass Z keine Klasse, sondern nur ein Interface ist. Interfaces haben den Vorteil, dass egal welche Klasse sie Implementier, diese Klasse eben genau diese Schnittstelle, also die darin vorgegebenen Methoden haben muss. Schau dir mal folgende Beispiele an: Das ist das Interface in paketB
Hier nun die Klassen, die das Interface implementieren:
Und hier die Klasse Nutzer, welches das Interface benutzt:
Ich hoffe das erklärt die Verwendung von Interfaces. Wenn noch weitere Fragen sind, kannst Du gern hier nachhaken. Gruß, Karlito |
||||||||||||||||||||
16.11.2014, 17:18 | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Haevelin | RE: Eine Klasse oder Interface konstruieren In meinem konkreten Fall: Mein interface wäre leer und K1 und K2 implementieren es; also brauche ich keine @override. Nur die Änderung von Nutzer kann ich nicht ganz nachvollziehen. Wo ist der Konstruktor geblieben? Und test einmal auf K1(), dann auf K2() festzulegen funktioniert nicht. Wie sollte dann meine main Funktion aussehen. Bisher habe ich: public class Aufgabe111 { public static void main(String[] args) { // TODO Auto-generated method stub K1 k1 = new K1(); K2 k2= new K2(); Nutzer nutzer= new Nutzer(k1,k2,10); nutzer.aendern(5); nutzer.analysieren(5.0); } } |
||||||||||||||||||||
Anzeige | |||||||||||||||||||||
|
|||||||||||||||||||||
16.11.2014, 21:01 | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Karlito | Hallo Haevelin, bitte bette deinen Code in eine [code][/code] Umgebung ein. Ein leeres Interface ist nicht sinnvoll und auch gar nicht möglich. Interfaces abstrahieren gemeinsame Schnittstellen. Hat also Klasse A und Klasse B gemeinsame Methoden, so können diese im Interface definiert werden. Bei der Verwendung der Klassen muss dann nur noch mit dem Interface gearbeitet werden (man weist die Objektinstanz einer Variablen vom Typ des Interfaces zu). Was sollen denn die Klassen K1 und K2 leisten? Und was hat die Klasse Nutzer denn damit zu tun? Gruß, Karlito |
||||||||||||||||||||
27.11.2014, 09:46 | Auf diesen Beitrag antworten » | ||||||||||||||||||||
Haevelin | Hallo Karlito, wir haben mittlerweile die Lösung bekommen. Die Idee ist es Z so zu konstruieren, dass es die Methoden von K1 und K2 überlädt, und dabei die spezifischen Methoden von K1 bzw. K2 aufruft. Ein Interface war dazu nicht nötig; es wäre sogar irreführend. |
|
Verwandte Themen
Die Beliebtesten » |
Die Größten » |
|
Die Neuesten » |
|