Dienstag, 1. Dezember 2009
Einführungsbeispiel Klassen/Objekte
Folgende Klasse soll Geld implementieren. Da es in verschiedenen Ländern unterschiedliche Währungen gibt, muss unsere Klasse neben dem Betrag auch die Währung beinhalten. Um rechnen zu können wird noch eine Währungstabelle mitgespeichert.
Die Währungstabelle
Die Attribute (Eigenschaften) sind alle öffentlich (
Die Methode
Die Methode
Der Konstruktor wird in diesem Klassendiagramm nicht angegeben. Durch ihn wird aber die Währung der Betrag festgelegt. Der Konstruktor wird ausgeführt, wenn ein Objekt erzeugt wird.
Die Umsetzung in Python
Der Wechselkurs wird einfach in Form eines Dictionaries gespeichert.
Der Konstruktor heißt in Python immer
In Python muss bei Methoden immer
Die Umsetzung in Java
Anders als in Python heißt hier die Referenz auf das aktuelle Objekt
Dennoch kann man
Man muss
Der Kunstruktor heißt in Java immer so wie die Klasse, in unserem Fall
Die Währungstabelle
Testausgabe:
Scrapbook oop.jpage zum Download (Python Code kann nicht im Scrapbook ausgeführt werden).
Die Währungstabelle
wechselkurs
könnte natürlich auch wieder in eigenen Klassen/Objekten realisiert werden (im Java-Code ist das auch tatsächlich der Fall).Die Attribute (Eigenschaften) sind alle öffentlich (
public
), da damit das Beispiel kürzer wird. Tatsächlich werden normalerweise die Attribute nach außen unsichtbar gemacht (private
) und nur Methoden öffentlich gemacht, um den Zugriff auf das Innere der Objekte zu verhinden (Information Hiding oder Datenkapselung).Die Methode
getEuro()
liefert den auf Euro umgerechneten Geldbetrag.Die Methode
add(geld)
addiert den Wert des Parameters geld
zum Wert des aktuellen Objekts und erzeugt ein neues Objekt mit der Summe und liefert es als Returnwert zurück.Der Konstruktor wird in diesem Klassendiagramm nicht angegeben. Durch ihn wird aber die Währung der Betrag festgelegt. Der Konstruktor wird ausgeführt, wenn ein Objekt erzeugt wird.
Die Umsetzung in Python
Der Wechselkurs wird einfach in Form eines Dictionaries gespeichert.
Der Konstruktor heißt in Python immer
__init__(self)
.In Python muss bei Methoden immer
self
angegeben werden. Damit wird die Methode mit einem bestimmten Objekt (zu einer bestimmten Klasse zugehörig) verbunden. Man kann sich den Aufruf mietwagen.add(hotelrechnung)
so vorstellen: add(mietwagen, hotelrechnung)
. Die Objektreferenz mietwagen
wird also als Parameter an die Methode add(self)
übergeben. In der Methode add(self)
kann dann auf das Objekt über self
zugegriffen werden.# Python Klasse Geld
class Geld:
wechselkurs = { 'USD': 1.505, # US-$ (1EUR sind 1.505 USD)
'GBP': 0.908, # Britische Pfund
'EUR': 1.0,
'CHF': 1.509, # Schweizer Franken
'JPY': 130.582, # Japanische Yen
}
def __init__(self, waehrung, betrag):
self.waehrung = waehrung
self.betrag = float(betrag)
def getEuro(self):
"""liefert den Betrag in EUR"""
return self.betrag / self.wechselkurs[self.waehrung]
def add(self, geld):
"""addiert Geld und liefert summe als Geld"""
summeInEuro = self.getEuro() + geld.getEuro()
summe = Geld(self.waehrung, summeInEuro * self.wechselkurs[self.waehrung])
return summe
if __name__ == '__main__':
hotelrechnung = Geld('EUR', 560)
mietwagen = Geld('USD', 760)
summe = mietwagen.add(hotelrechnung) # summe = add(mietwagen, hotelrechnung)
print "Summe: %s%.2f, %s%.2f\n" % (summe.waehrung, summe.betrag, "EUR", summe.getEuro())
Die Umsetzung in Java
Anders als in Python heißt hier die Referenz auf das aktuelle Objekt
this
und nicht self
. this
wird nicht als Parameter deklariert. Den Methoden fehlt ein this
-Parameter (bzw. self
). Dieser Parameter existiert nur intern.Dennoch kann man
this
beim Zugriff auf Attribute (und Methoden) angeben. Im folgenden Beispiel wird das auch gemacht.Man muss
this
nur dann angeben, wenn es sonst zu Mehrdeutigkeiten käme (in unserem Beispiel beim Konstruktor, wo die Parameter genauso benannt sind wie die Attribute).Der Kunstruktor heißt in Java immer so wie die Klasse, in unserem Fall
Geld()
.Die Währungstabelle
wechselkurs
wird als Array einer eigenen Klasse Wechselkurs
realisiert. Zusätzlich benötigt man mangels Dictionary eine Methode, die zu einer gegebenen Währung den Kurs liefert: getKurs()
class Geld {
final class Wechselkurs { // final nur für's scrapbook
String waehrung;
double kurs;
public Wechselkurs(String waehrung, double kurs) {
this.waehrung = waehrung;
this.kurs = kurs;
}
}
private Wechselkurs[] wechselkurs = {
new Wechselkurs("USD", 1.505), // US-$ (1EUR sind 1.505 USD)
new Wechselkurs("GBP", 0.908), // Britische Pfund
new Wechselkurs("EUR", 1.0),
new Wechselkurs("CHF", 1.509), // Schweizer Franken
new Wechselkurs("JPY", 130.582),// Japanische Yen
};
String waehrung;
double betrag;
public Geld(String waehrung, double betrag) {
this.waehrung = waehrung;
this.betrag = betrag;
}
public double getEuro() {
return this.betrag / this.getKurs();
}
private double getKurs() {
for (Wechselkurs kurs : this.wechselkurs) {
if (kurs.waehrung.equals(this.waehrung)) {
return kurs.kurs;
}
}
return 0.0;
}
public Geld add(Geld geld) {
double summeInEuro = this.getEuro() + geld.getEuro();
Geld summe = new Geld(this.waehrung, summeInEuro * this.getKurs());
return summe;
}
}
/*** Testaufrufe ***/
Geld hotelrechnung = new Geld("EUR", 560);
Geld mietwagen = new Geld("USD", 760);
Geld summe = mietwagen.add(hotelrechnung);
System.out.printf("Summe: %s%.2f, %s%.2f\n", summe.waehrung, summe.betrag,
"EUR", summe.getEuro());
Testausgabe:
Summe: USD1602,80, EUR1064,98
Scrapbook oop.jpage zum Download (Python Code kann nicht im Scrapbook ausgeführt werden).
Abonnieren Posts [Atom]
Kommentar veröffentlichen