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 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).

Labels: , ,


Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]





<< Startseite

This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]