Einführung
In dieser Einführung wird kurz auf die Geschichte der
Programmiersprachen und die Eigenheiten der objektorientierten
Programmierung eingegangen. Im nächsten Kapitel wird etwas zur GUI
Programmierung erläutert. Geschichte der Programmiersprachen
Die ersten Programmiersprachen waren funktionsorientiert.
Beispiele:
|
Vorteile |
Nachteile |
- Kleine Projekte
- Modellierung einfach (Struktogramm)
|
- Mangelnder Schutz der Daten
- Mangelnde Verständlichkeit
- Mangelnde Übersicht
- Mangelnde Wiederverwendbarkeit
|
|
|
Abb. 1.1: Funktionsorientiertes
Programmieren
|
Objektorientierter Ansatz
Im objektorientierten Ansatz werden alle Nachteile der
funktionsorientierten Programmierung aufgehoben, da Daten hier das
Zentrum der Programmentwicklung darstellen. |
|
Abb. 1.2: Objektorientiertes
Programmieren
|
|
|
Vorteile |
Nachteile |
- Hoher Schutz der Daten
- Hohe Verständlichkeit
- Hohe Übersicht
- Hohe Wiederverwendbarkeit
- Große Projekte
|
- Umfangreich zu lernen und zu verstehen
- Modellierung aufwändig (UML)
|
|
Beispiele
Wie sich aus den Vor- und Nachteilen ergibt, muss jedoch ein
hoher Aufwand für die Modellierung betrieben werden. Dazu ist die
UML (Unified Modelliong Language) entwickelt worden.
Die UML
Dieser Modellierungswerkzeugkoffer enthält unterschiedliche
Diagrammtypen.
- Anwendungsfalldiagramm (Use Case)
- Klassendiagramm
- Verhaltensdiagramme
- Aktivitätsdiagramm
- Kollaborationsdiagramm
- Sequenzdiagramm
- Zustandsdiagramm
- Implementierungsdiagramme
- Komponentendiagramm
- Verteilungsdiagramm
In der neuen Spezifikation UML 2.0 kommen andere Diagrammtypen
dazu, die die vorhandenen erweitern oder verbessern. Außerdem gibt
es Diagramme, die den zeitlichen Ablauf von Programmen beschreiben.
Das Ziel dieser Diagramme ist die Analyse und das Design von
objektorientierten Programmen. Dabei zielt alles auf das Erstellen
von einem möglichst vollständigen und fehlerlosen Klassendiagramm
ab.
Aus diesen Klassendiagrammen können dann Interfaces entwickelt
werden.
Interfaces
Interfaces sind also das Ergebnis der objektorientierten Analyse
und Design durch die UML. Was genau macht also ein Interface aus?
In einem Klassendiagramm wird von einer vollständigen Klasse
ausgegangen. Interfaces werden speziell deklariert. |
|
Abb. 1.3: Klassen und
Interfaces in der UML
|
|
Interfaces sind Vorlagen, mit denen Klassen
programmiert werden. Dazu stellen Interfaces leere Methodenrümpfe
und gegebenenfalls Konstanten zur Verfügung.
|
public interface
PersonVorlage {
public void setName(String name);
public void setAdresse(String
adresse);
public String getName();
public String getAdresse();
} |
Tab. 1.1: Beispiel eines
Interfaces |
|
Hier sieht das Interface PersonVorlage die Methoden
setName(), setAdresse(), getName() und getAdresse() vor. Jede dieser
Methoden müssen in der implementierenden Klasse verwendet
und ausprogrammiert werden.
Folgendermaßen sieht die Implementierung aus: |
public class Person implements
PersonVorlage {
private String name =
"";
private String adresse = "";
public void setName(String name)
{
this.name = name;
}
public void setAdresse(String
adresse) {
this.adresse = adresse;
}
public String getName() {
return this.name;
}
public String getAdresse() {
return this.adresse;
}
} |
Tab.: 1.2: Implementierung
des Interface PersonVorlage |
|
Abstrakte Klassen
Abstrakte Klassen lassen keine Instanziierung zu. Sie dienen wie
die Interfaces als Vorlage, wobei es hier erlaubt ist, Methoden und
Variablen zu deklarieren. Sie werden oft in der grafischen
Programmierung verwendet, um Grundfunktionen vorzugeben. |
//Abstrakte Klasse
abstract class Vorlage {
private int code = 0;
public void setCode(int code) {
this.code = code;
}
public int getCode() {
return this.code;
}
public abstract String
getName();
}
// Implementierung
public class
VorlagenImplementierung extends Vorlage {
// Abstrakte Methode
getName()
public String getName() {
return
"Vorlagenimplementierung";
}
} |
Tab. 1.3: Abstrakte Klasse
Vorlage |
|
Somit wird in der abstrakten Klasse ein Attribut und
drei Methoden vorgegeben, wobei eine davon abstrakt ist.
Wird die abstrakte Klasse implementiert, so kann die
implementierende Klasse auf alle Attribute und Methoden der
abstrakten Klasse zugreifen. Die abstrakte
Methode muss jedoch noch ausprogrammiert werden.
Nützlich ist so etwas in der grafischen Programmierung, um
Grundfunktionalitäten, wie den "Beenden"-Menüknopf
zwar anzulegen, aber erst im Programm auszuprogrammieren.
Adapterklassen
Wiederum handelt es sich um eine Vorlagenklasse. Sie
implementieren Interfaces, wobei hier jede Methode des
Interfaces übernommen und mit leeren Methodenrümpfen { } versehen werden muss. Ist in der GUI-Programmierung
sehr nützlich und gebräuchlich. |
// Interface
public interface
PersonVorlage {
public void setName(String name);
public void setAdresse(String
adresse);
public String getName();
public String getAdresse();
}
// Adapterklasse
public class PersonAdapter
implements PersonVorlage {
public void setName(String
name) {};
public void setAdresse(String
adresse) {};
public void setName(String name)
{};
public String getName() {};
}
// Implementierung
public class Person extends
PersonAdapter {
private String name =
"";
public void setName(String name)
{
this.name = name;
}
public String getName() {
return this.name;
}
} |
Tab. 1.4: Adapterklasse |
|
Das Nützliche an der Adapterklasse ist, dass
Interfaces nur in der Adapterklasse selbst komplett übernommen
werden müssen. In die implementierende Klasse müssen nur Methoden eingefügt
werden, die für das Programm benötigt werden.
Innere Klassen
Innere Klassen sind Klassendefinitionen innerhalb anderer Klassen
(Aggregation). Zu den inneren Klassen gehören auch anonyme Klassen.
Diese Klassenarten werden zur grafischen Programmierung und zur
Komponentenentwicklung verwendet (Java Beans).
|
class Aussen
{
...
class Mitte { //nur
durch Klasse Aussen verwendbar
...
class Innen { //nur
durch Klasse Mitte verwendbar
...
}
}
} |
Tab. 1.5: Aufbau eines
Programms mit inneren Klassen |
|
Innere Klassen
- Können auf Daten und Methoden der äußeren Klasse zugreifen.
- Sind den anderen Klassen verborgen.
- Können nur in der äußeren Klasse erzeugt werden. Ausnahme:
Statische innere Klassen.
- Für jede innere Klasse wird eine eigene .class-Datei erzeugt.
Anonyme Klassen
- Besitzen keine Namen, da die Klassendefinition und
Objekterzeugung in einem Schritt erfolgt.
- Benötigt, wenn nur eine einzige Objektinstanz benötigt wird.
|