Klasse (Objektorientierung)Unter einer Klasse (auch Objekttyp genannt) versteht man in der objektorientierten Programmierung ein abstraktes Modell bzw. einen Bauplan für eine Reihe von ähnlichen Objekten. Die Klasse dient als Bauplan für die Abbildung von realen Objekten in Softwareobjekte und beschreibt Attribute (Eigenschaften) und Methoden (Verhaltensweisen) der Objekte. Verallgemeinernd könnte man auch sagen, dass eine Klasse dem Datentyp eines Objekts entspricht. VererbungKlassen können miteinander in hierarchischen Beziehungen stehen und zu komplexen Strukturen werden. Die Gesetzmäßigkeiten, nach denen diese gebildet werden, beschreibt das grundlegende Konzept der Vererbung. Hier sind weiterhin die Begriffe Basisklasse und abgeleitete Klasse von Bedeutung, um die Verhältnisse der Klassen untereinander zu charakterisieren. Dabei beschreibt die Basisklasse allgemeine Eigenschaften, ist also eine Verallgemeinerung der abgeleiteten Klassen. Diese sind somit Spezialisierungen der Basisklasse. Beispiel: Basisklasse Dabei „erben“ die abgeleiteten Klassen alle Eigenschaften und Methoden der Basisklasse (d. h., ein Motorrad hat alle Eigenschaften eines Kraftfahrzeugs, und man kann alles mit ihm machen, das man mit einem Kraftfahrzeug machen kann). Zusätzlich führt die abgeleitete Klasse zusätzliche Eigenschaften und Methoden ein, die bei ihren Objekten möglich sind. Das Motorrad hat z. B. einen Gepäckträger, ein Auto nicht, dafür aber einen Kofferraum. ProgrammierstilIn vielen Programmiersprachen ist es üblich, dass der Name einer Klasse mit einem Großbuchstaben beginnt und in Camel-Case-Notation geschrieben wird (Namenskonventionen von Java, JavaScript, .NET, Objective-C, PHP, Perl, Python, Swift). Die Namen der Variablen dagegen werden bei manchen Programmiersprachen mit einem Kleinbuchstaben begonnen. Vergleich mit VerbundÄhnlich der Klasse ist der Verbund ein Werkzeug zum Verwalten von zusammengehörigen Attributen. Er ist ein zusammengesetzter Datentyp aus verschiedenen anderen Datentypen. Die einzelnen Komponenten können als Attribute des neuen Verbundtyps betrachtet werden. Je nach Programmiersprache können sich Verbund und Klasse mehr oder weniger stark unterscheiden. Beispiele für Unterschiede sind:
BeispieleC#Als Beispiel soll eine Lampe dienen. Eine Lampe kann verschiedene Eigenschaften (Attribute) besitzen, zum Beispiel Farbe, Gewicht und ob sie leuchtet. Da man mit den Eigenschaften Farbe und Größe wenig operieren kann, wäre eine sinnvolle Verhaltensweise demnach eine Lichtschalter-Methode, die den jeweiligen Zustand von an und aus bestimmt. Beispiel-Implementierung in C#: class Lampe {
// Eigenschaften
Color gehaeusefarbe;
double gewicht;
Color lichtfarbe;
double helligkeit;
bool istEingeschaltet;
// Methoden
void einschalten() {
istEingeschaltet = true;
}
void ausschalten() {
istEingeschaltet = false;
}
}
Das Konzept der Vererbung lässt sich daran zeigen, dass es verschiedene Arten von Lampen gibt, z. B. Straßenlaternen, Taschenlampen oder Autoscheinwerfer. Diese speziellen Lampenarten sind dann Unterklassen der Klasse In C#: // Unterklassen der Klasse Lampe
class Taschenlampe : Lampe {
// zusätzliche Eigenschaften
double maximaleLeuchtdauer;
// zusätzliche Methoden
void batterieLaden() {
// Implementierung der Methode
}
}
class Autoscheinwerfer : Lampe {
// zusätzliche Eigenschaften
bool istKippbar;
// zusätzliche Methoden
void fernlichtEinschalten() {
// Implementierung der Methode
}
}
Eine Klasse kann als Datentyp verwendet werden (z. B. für Attribute oder Methoden-Parameter). Beispiel: Ein Parlament besteht aus mehreren Abgeordneten, die Mögliche C#-Implementierung: class Person {
// Eigenschaften
string vorname;
string nachname;
Date geburtsdatum;
List<string> nationalitaeten;
string MailAdresse;
string Postanschrift;
}
class Partei {
// Eigenschaften
string name;
List<Person> mitglieder;
}
// Unterklasse der Klasse Person
class Abgeordneter: Person {
// Eigenschaften
Partei partei;
// Methoden
Partei gibPartei() {
return partei;
}
}
class Parlament {
// Eigenschaften
Abgeordneter vorsitzender;
int maximalGroesse;
// Liste von Objekten der Klasse Abgeordneter
List<Abgeordneter> listeAbgeordnete = new List<Abgeordneter>();
// Methoden
void setzeVorsitzenden(Abgeordneter abgeordneter) {
vorsitzender = abgeordneter;
}
int gibAnzahlDerAbgeordneten(Partei partei) {
int anzahl = 0;
foreach (Abgeordneter einAbgeordneter in listeAbgeordnete) {
if (einAbgeordneter.gibPartei() == partei) {
anzahl = anzahl + 1;
}
}
return anzahl;
}
}
RubyDas folgende Beispiel ist in der Programmiersprache Ruby geschrieben: # Die Klasse "Fahrzeug" ist die Basisklasse.
class Fahrzeug
def bewegen()
puts "Fahrzeug wird bewegt."
end
end
# Die Klasse "Auto" ist die abgeleitete Klasse.
class Auto < Fahrzeug
def bewegen()
puts "Auto wird bewegt."
end
end
def fahren(fahrzeug)
# zur Verdeutlichung der sog. "Polymorphie"
fahrzeug.bewegen()
end
# Hauptprogramm
fahrzeug = Fahrzeug.new
auto = Auto.new
fahrzeug.bewegen()
auto.bewegen()
# Polymorphie: Methode 'fahren'
fahren(fahrzeug)
fahren(auto)
Dieses Programm definiert eine Klasse Die Basisklasse besitzt eine Methode namens Anschließend folgt die Definition einer eigenständigen Funktion Schließlich folgt das Hauptprogramm, das sowohl ein Objekt der Basisklasse ( Wird dieses Programm ausgeführt, so erscheint auf dem Bildschirm: Fahrzeug wird bewegt.
Auto wird bewegt.
Fahrzeug wird bewegt.
Auto wird bewegt.
Es ist zu erkennen, dass, obwohl die Funktion ErweiterungEine Erweiterung bzw. Abstraktion dieses Konzepts findet sich in dem Modell der abstrakten Klassen und der Metaklassen. Möglich ist auch eine sogenannte anonyme Klasse. Dabei wird eine Klasse nur an genau der Stelle beschrieben, an der ein Objekt von ihr erzeugt wird. Sie ist nicht getrennt (zum Beispiel in einer eigenen Datei) als eigenständige Komponente im Quellcode beschrieben und kann daher auch von anderen Programmteilen nicht wiederverwendet oder gezielt angesprochen werden. Die Klasse erhält auch keinen eigenen Namen. In der Regel erbt sie jedoch von einer anderen, diese beschreibt dann die Haupteigenschaften und -methoden des Objekts für seine spätere Verwendung. Die abgeleitete, namenlose Klasse modifiziert das Verhalten meist nur geringfügig. Ein Beispiel in Java: import java.awt.Button;
import java.awt.event.ActionListener;
// Erzeugen eines Button-Objekts, speichern in hilfeButton
// "Hilfe" ist die Beschriftung des Buttons
Button hilfeButton = new Button("Hilfe");
// Zum Button wird ein Objekt hinzugefügt, das eine Methode "actionPerformed"
// besitzt. Die Methode wird aufgerufen, wenn der Button angeklickt wird.
hilfeButton.addActionListener(
new ActionListener() {
void actionPerformed(ActionEvent e) {
System.out.println("Hilfetext");
}
} // end anonymous class
);
Es wird mit Mitunter wird ähnlich einer anonymen Klasse auch eine innere Klasse definiert. Unterschied zu einer „normalen“ Klasse ist zunächst der Sichtbarkeitsbereich, eine innere Klasse ist innerhalb einer anderen („äußeren Klasse“) definiert. Ist sie privat, so können nur Objekte der äußeren Klasse Objekte der inneren erzeugen und verwenden. Ist die innere Klasse nicht-statisch, so ist eine Objekterzeugung sogar abhängig von einem Objekt der äußeren Klasse und nur über ein solches Objekt möglich. ReflexionManche Programmiersprachen erlauben es, dass ein Programm die Struktur seiner Klassen kennt und auch das Verändern von Klassen zur Laufzeit, wie beispielsweise das Ändern der Struktur durch Hinzufügen oder Entfernen von Eigenschaften oder Methoden. Diese sogenannte „Reflexion“ sollte nur im Notfall verwendet werden, da das Programm dadurch schwer verständlich und Refactoring erschwert wird. Siehe auch
Literatur
WeblinksWikibooks: Objektorientierte Programmierung (PHP) – Lern- und Lehrmaterialien
|