s09 – Klassen und Objekte 2 – Klassenfunktionen, get/set

 

Nehmen wir an, Tante Hilde hat eine Bank ausgeraubt und wählt ihr Auto als Fluchtfahrzeug. Um nicht sofort von der Polizei erwischt zu werden, möchte sie das Fahrzeug natürlich umlackieren.

Im Programm können wir die Eigenschaften der Klasse einfach ändern, indem wir einen neuen Wert zuweisen.
Die Syntax hierfür ist:

[Objekt].[Eigenschaft] = [neuer Wert]

Beispiel:

Auto Auto1 = new Auto(1993, 95000, "CE-FR-395", "blau", "Tante Hilde");

// [...] Bank ausrauben [...]

// Farbe ändern:
Auto1.sFarbe = "rot";

In einer Klasse können nicht nur Eigenschaften und der Konstruktor, sondern auch weitere Funktionen und Methoden definiert werden.
Wir wollen nun, um Tante Hilde zu helfen, eine “AendereAussehen” Methode definieren, die sowohl das Nummernschild ändert als auch das Auto neu lackiert.

In Java ist das wie folgt möglich:

public class Auto
{
	int iBaujahr;
	int iKilometerstand;
	String sKennzeichen;
	String sFarbe;
	String sBesitzer;
	// weitere Eigenschaften

	// alter Konstruktor:
	public Auto(int iBJ, int iKM, String sKZ, String sFB, String sBes)
	{
		iBaujahr = iBJ;
		iKilometerstand = iKM;
		sKennzeichen = sKZ;
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// neuer, vereinfachter Konstruktor:
	public Auto(String sFB, String sBes)
	{
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// Hilfsmethode zum Ändern des Aussehens des Autos:
	public void AendereAussehen(String "sNeuesKennzeichen", String "sNeueFarbe)
	{
		sKennzeichen = sNeuesKennzeichen;
		sFarbe = sNeueFarbe;
	}
}

Das Programm können wir nun wie folgt schreiben:

Auto Auto1 = new Auto(1993, 95000, "CE-FR-395", "blau", "Tante Hilde");

// [...] Bank ausrauben [...]

// Aussehen ändern:
Auto1.AendereAussehen("HH-FA-231", "grün");

Funktionen in Klassen, public und private

Wir wollen unsere Klasse “Auto” nun an einen anderen Programmierer weitergeben.
Wenn dieser die Klasse einfach benutzt, ohne sie sich vorher genau anzuschauen, kann es sein, dass er Variablen falsche Werte zuweist und so verhindert, dass die Klasse richtig funktioniert.

Zum Beispiel könnte der andere Programmierer denken, man müsse der Variable iBaujahr nicht das Baujahr, sondern das Alter in Jahren zuweisen. Er würde dann schreiben:

Auto Auto1 = new Auto(1993, 95000, "CE-FR-395", "blau", "Tante Hilde");
Auto1.iBaujahr = 12;

Die Klasse kann diesen Irrtum bisher nicht verhindern, da sie keine Kontrolle darüber hat, was für Werte den Variablen zugewiesen werden.
Um dieses Problem zu lösen, verhindern wir einfach, dass den Klassenvariablen direkt Werte zugewiesen werden können. Wir verändern dazu die Deklaration der Variablen wie folgt:

public class Auto
{
	private int iBaujahr;
	private int iKilometerstand;
	private String sKennzeichen;
	private String sFarbe;
	private String sBesitzer;
	// weitere Eigenschaften

	// alter Konstruktor:
	public Auto(int iBJ, int iKM, String sKZ, String sFB, String sBes)
	{
		iBaujahr = iBJ;
		iKilometerstand = iKM;
		sKennzeichen = sKZ;
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// neuer, vereinfachter Konstruktor:
	public Auto(String sFB, String sBes)
	{
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// Hilfsmethode zum Ändern des Aussehens des Autos:
	public void AendereAussehen(String "sNeuesKennzeichen", String "sNeueFarbe)
	{
		sKennzeichen = sNeuesKennzeichen;
		sFarbe = sNeueFarbe;
	}
}

Die Variablen sind nun privat, der Befehl

Auto1.iBaujahr = 12;

führt also zu einem Fehler. Das Problem ist nur, dass nun von außen zwar kein falscher, aber auch kein richtiger Wert mehr zugewiesen werden kann.
Um die Zuweisung eines “richtigen” Wertes wieder zu ermöglichen, brauchen wir nun sogenannte “setter”-Methoden.

Die Klasse ändert sich mit diesen Methoden wie folgt:

public class Auto
{
	private int iBaujahr;
	private int iKilometerstand;
	private String sKennzeichen;
	private String sFarbe;
	private String sBesitzer;
	// weitere Eigenschaften

	// alter Konstruktor:
	public Auto(int iBJ, int iKM, String sKZ, String sFB, String sBes)
	{
		iBaujahr = iBJ;
		iKilometerstand = iKM;
		sKennzeichen = sKZ;
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// neuer, vereinfachter Konstruktor:
	public Auto(String sFB, String sBes)
	{
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// Hilfsmethode zum Ändern des Aussehens des Autos:
	public void AendereAussehen(String "sNeuesKennzeichen", String "sNeueFarbe)
	{
		sKennzeichen = sNeuesKennzeichen;
		sFarbe = sNeueFarbe;
	}

	public void SetBaujahr(int iBJ)
	{
		iBaujahr = iBJ;
	}

	public void SetKilometerstand(int iKM)
	{
		iKilometerstand = iKM;
	}
	// [...] weitere setter-Methoden [...]
}

Um nun das Baujahr des Autos zu ändern, kann man im Programm wie folgt verfahren:

Auto1.SetBaujahr(1993);

Es stellt sich natürlich die Frage, ob man nicht nun einfach dieser Methode “SetBaujahr” genauso den Falschen Wert übergeben könnte wie bei der direkten Zuweisung, denn dann hätte die Methode ja keinen Vorteil.
Dies ist zwar richtig, aber im Gegensatz zu der Wertzuweisung hat die Klasse bei der Zuweisung über die setter-Funktion eine Möglichkeit zur Kontrolle des übergebenen Wertes. Wir können die Methode “SetBaujahr” wie folgt anpassen:

	public void SetBaujahr(int iBJ)
	{
		if(iBJ > 1800)
			iBaujahr = iBJ;
		else
			iBaujahr = 2009-iBJ;
	}

Es ist unwahrscheinlich, dass das Auto vor 1800 gebaut wurde. Wenn also ein Wert übergeben wird, der kleiner ist als 1800, dann wird automatisch der Wert 2009 (aktuelles Jahr)-iBJ zugewiesen. Der andere Programmierer merkt also nicht einmal etwas von seinem Fehler, weil das Programm ihn automatisch berichtigt.

Nun können wir den Variablen des Objektes Auto1 Werte zuweisen. Da die Variablen aber privat sind, können wir danach nicht mehr auf die Variablen zugreifen, wir wissen also nicht mehr, was in den Variablen gespeichert ist.
Zu diesem Zweck brauchen wir “getter”-Funktionen. Dies sind Funktionen ohne übergebene Parameter, die den aktuellen Wert der Variable zurückgeben.

In die Klasse eingebaut:

public class Auto
{
	private int iBaujahr;
	private int iKilometerstand;
	private String sKennzeichen;
	private String sFarbe;
	private String sBesitzer;
	// weitere Eigenschaften

	// alter Konstruktor:
	public Auto(int iBJ, int iKM, String sKZ, String sFB, String sBes)
	{
		iBaujahr = iBJ;
		iKilometerstand = iKM;
		sKennzeichen = sKZ;
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// neuer, vereinfachter Konstruktor:
	public Auto(String sFB, String sBes)
	{
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// Hilfsmethode zum Ändern des Aussehens des Autos:
	public void AendereAussehen(String "sNeuesKennzeichen", String "sNeueFarbe)
	{
		sKennzeichen = sNeuesKennzeichen;
		sFarbe = sNeueFarbe;
	}

	public void SetBaujahr(int iBJ)
	{
		if(iBJ > 1800)
			iBaujahr = iBJ;
		else
			iBaujahr = 2009-iBJ;
	}

	public void SetKilometerstand(int iKM)
	{
		iKilometerstand = iKM;
	}
	// [...] weitere setter-Methoden [...]

	public int GetBaujahr()
	{
		return iBaujahr;
	}

	public int GetKilometerstand()
	{
		return iKilometerstand;
	}
	//
}

Ähnliche Artikel

Kommentar verfassen