Aufgabe zu Schnittstellen

JavaIsTheBest

Bekanntes Mitglied
Hallo,
in der Aufgabe steht folgender Satz.

Definieren Sie Account, ChargedAccount und LimitedAccount mit den aus der Vorlesung bzw. früheren Aufgaben
bekannten Eigenschaften als Schnittstellen!


Jetzt sind Eigenschaften aber Attribute und keine Methoden. Ist die Aufgabe falsch formuliert oder wie soll ich das verstehen?

Und ich verstehe nicht, was die Methode "booking()" machen soll bzw. warum diese da ist?
 

Anhänge

  • 001.png
    001.png
    441,5 KB · Aufrufe: 40

mrBrown

Super-Moderator
Mitarbeiter
Es sollen nicht die Attribute selbst, sondern die Methoden für diese deklariert werden. Ist vllt etwas unschön formuliert...

#booking soll einen Betrag entgegennehmen, und diese zum Kontostand addieren. So müssen die Unterklassen nicht mehr #deposit und #withdraw implementieren, sondern das unkomplexere #booking
 

JavaIsTheBest

Bekanntes Mitglied
1) Kann man folgendes sagen?

Ein ChargedLimitedAccount ist ein ChargedAccount oder LimitedAccount.
Ein ChargedAccount oder LimitedAccount ist ein ChargedLimitedAccount.

2) Müssen die Objektvariablen in der Klasse AccountImpl unbedngt final sein oder reicht auch private aus?

3) Warum wird die Variable private final int number deklariert aber nicht im Konstruktor aufgerufen?

4) Warum ist das möglich, obwohl der Konstruktor nur ein Argument als Parameter hat?

Java:
public AccountImpl (String h) {
this(h, 0);
}
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
1) Kann man folgendes sagen?

Ein ChargedLimitedAccount ist ein ChargedAccount oder LimitedAccount.
Ein ChargedAccount oder LimitedAccount ist ein ChargedLimitedAccount.
ChargedLimitedAccount ist ChargedAccount und LimitedAccount
Die Implementationen von ChargedAccount oder LimitedAccount können ChargedLimitedAccount sein, müssen aber nicht. Die Interfaces ChargedAccount und LimitedAccount sind kein ChargedLimitedAccount.

2) Müssen die Objektvariablen in der Klasse AccountImpl unbedngt final sein oder reicht auch private aus?

final bedeutet etwas anderes als private. privat heißt nicht sichtbar, final nicht änderbar.
Sinnvoll ist hier final, da sich zB die Kontonummer niemals ändern darf.

3) Warum wird die Variable private final int number deklariert aber nicht im Konstruktor aufgerufen?

Nummer wird direkt initialisiert, muss also nicht mehr im Konstruktor gesetzt werden. Bei final ginge auch nur entweder so, oder im Konstruktor. Hier sorgt das für fortlaufende Nummern.

4) Warum ist das möglich, obwohl der Konstruktor nur ein Argument als Parameter hat?

Java:
public AccountImpl (String h) {
this(h, 0);
}

this(...) ruft einen anderen Konstruktor auf, in diesem Fall AccountImpl(String h, int b). Wie viele Argumente die beiden haben ist egal, es müssen nur bei jedem Aufruf die passenden sein.
 

JavaIsTheBest

Bekanntes Mitglied
1. Das heißt, jedes Mal, wenn ein neues Objekt erzeugt wird, dann wird "number" automatisch um Eins erhöht?

2. In der Klasse ChargedAccountImpl gibt es die Methode charge(int amount). Ist amount die Gebühr? Und warum gibt es in der Musterlösung keine Objektvariable charge? Das hätte ich mit reingenommen.
 
Zuletzt bearbeitet:

JavaIsTheBest

Bekanntes Mitglied
3. Wozu sind die zwei Klassen ChargedLimitedAccountImpl1 und ChargedLimitedAccountImpl2 da? Hätte nicht einfach eine Klasse ChargedLimitedAccountImpl gereicht?

4. In der Musterlösung steht in der Klasse LimitedAccountImpl die Methode public static boolean check (LimitedAccount account, int amount).
LimitedAccount ist eine Schnittstelle. Ist das erlaubt, dass man als Parametertyp, eine Schnittstelle angibt?

5. Stimmt meine check- Methode soweit? Ich weiß nicht, ob das limit positiv oder negativ betrachtet wird.

Java:
public static boolean check(LimitedAccount la, int amount){
     if(la.balance()-amount<la.limit()){
       System.out.println("Unzulässige Kontoüberziehung");
       return false;
     }
     return true;

6. Die Methoden withdraw und transfer werden in der Klasse LimitedAccountImpl überschrieben. Diese Methoden sind aber nicht in der Klasse AccountImpl implementiert. Kommen die Methoden aus dem Interface Account?
 

mrBrown

Super-Moderator
Mitarbeiter
1. Das heißt, jedes Mal, wenn ein neues Objekt erzeugt wird, dann wird "number" automatisch um Eins erhöht?

Jein, number wird auf nextNumber gesetzt, und nextNumber direkt incrementiert.
number ist Instanzvariable, nextNumber Klassenvariable.


2. In der Klasse ChargedAccountImpl gibt es die Methode charge(int amount). Ist amount die Gebühr? Und warum gibt es in der Musterlösung keine Objektvariable charge? Das hätte ich mit reingenommen.

Leider ist nirgendwo beschrieben, was genau #charge machen soll, bzw aufgerufen werden soll. Mit vernünftigem JavaDoc wäre das klarer gewesen...
Wofür hättest du denn die Variable benutzt?


3. Wozu sind die zwei Klassen ChargedLimitedAccountImpl1 und ChargedLimitedAccountImpl2 da? Hätte nicht einfach eine Klasse ChargedLimitedAccountImpl gereicht?

WO sind sie denn da? Vermutlich sind das zwei mögliche Implementationen des Interfaces, man kann logischerweise nicht beide in einer Klasse unterbringen, brauchen tut man aber nur eine.


4. In der Musterlösung steht in der Klasse LimitedAccountImpl die Methode public static boolean check (LimitedAccount account, int amount).
LimitedAccount ist eine Schnittstelle. Ist das erlaubt, dass man als Parametertyp, eine Schnittstelle angibt?
Es ist nicht nur erlaubt, sondern erwünscht, Interfaces und nicht Klassen bei der Deklaration zu benutzen ;)
So klappt die Methode für alle LimitedAccounts, wäre da eine Klasse angegeben, klappt es nur für diese eine Klasse, für alle anderen Implementation, für die es nützlich wäre, klappt es aber nicht.

5. Stimmt meine check- Methode soweit? Ich weiß nicht, ob das limit positiv oder negativ betrachtet wird.

Wenn limit das untere Limit angibt, stimmt deine Methode so.
Wie das gemeint ist, steht sicherlich irgendwo erklärt (und gehört ins JavaDoc)

6. Die Methoden withdraw und transfer werden in der Klasse LimitedAccountImpl überschrieben. Diese Methoden sind aber nicht in der Klasse AccountImpl implementiert. Kommen die Methoden aus dem Interface Account?

Ja, implementiert sind sie auch schon in AbstractAccount.
Warum werden die in LimitedAccountImpl überschrieben?
 

JavaIsTheBest

Bekanntes Mitglied
ZU 2)
Wofür hättest du denn die Variable benutzt?

Die Variable charge hätte ich als Gebühr benutzt. Also, dass die Gebühr, 10 oder z.B. 20 Cent beträgt.

Zu 3) Im Anhang habe ich die zwei Klassen, ChargedLimitedAccountImpl1 und ChargedLimitedAccountImpl2 markiert.
...man kann logischerweise nicht beide in einer Klasse unterbringen, brauchen tut man aber nur eine.

Warum ist das so? Das verstehe ich noch nicht ganz, warum man zwei Klassen benötigt.

Zu 6)
withdraw() und transfer() werden überschrieben um unzulässige Überziehungen zu unterbinden.
 

Anhänge

  • 001.png
    001.png
    441,5 KB · Aufrufe: 22
  • 0002 .png
    0002 .png
    661,8 KB · Aufrufe: 29

mrBrown

Super-Moderator
Mitarbeiter
ZU 2)
Die Variable charge hätte ich als Gebühr benutzt. Also, dass die Gebühr, 10 oder z.B. 20 Cent beträgt.

Die Methode stammt sowieso aus dem Interface, da kann es das Feld nicht geben, das gäbe es dann höchstens in der Implementation. Allerdings auch nur wenn es nötig ist, uU ist die Gebühr ja auch ein Prozentsatz, da hätte man dann dafür ein Feld, und nicht mehr für die Gebühr an sich.

Zu 3) Im Anhang habe ich die zwei Klassen, ChargedLimitedAccountImpl1 und ChargedLimitedAccountImpl2 markiert.

Warum ist das so? Das verstehe ich noch nicht ganz, warum man zwei Klassen benötigt.

Man kann die Klasse auf 2 Arten implementieren, und hier ist einfach nur ein Beispiel für beide Varianten gegeben. Brauchen tut man nur eine, mehrere zur Auswahl haben ist aber selten schlecht ;)
 

JavaIsTheBest

Bekanntes Mitglied
Man kann die Klasse auf 2 Arten implementieren, und hier ist einfach nur ein Beispiel für beide Varianten gegeben. Brauchen tut man nur eine, mehrere zur Auswahl haben ist aber selten schlecht ;)

Achso, jetzt verstehe ich es. Mehrfachvererbung ist in Java nicht möglich. Deswegen gibt es eimal die Variante, wo von ChargedAccountImpl oder LimitedAccountImpl geerbt wird.
 

Neue Themen


Oben