Einführung in die objektorientierte Programmierung

Aus DMUW-Wiki
< Lernpfade‎ | AntMe!(Weitergeleitet von Lernpfade/AntMe!/Theorie)
Wechseln zu: Navigation, Suche
Mathematik-digital Pfeil-3d.png
Lernpfad

Einführung in die objektorientierte Programmierung


Teil 1 der Lernpfadgruppe: Programmieren mit AntMe!

  • Zeitbedarf: ca. 2-3 Unterrichtsstunden
  • Material: Laufzettel
  • Behandelte Themen: Objekte, Klassen, Algorithmus Datentyp, Modell

Grundbegriffe der Programmierung

Ingenieure und Entwickler strukturieren sich ihre Aufgaben, indem sie die Informationen aus einer objektorientierten Sichtweise betrachten. Dabei fassen sie alle Dinge, die in der realen Welt existieren, als Objekte auf, um ihre Problemstellung zu bewältigen. Wie wir später sehen werden, lassen sie ihre Objekte für sich arbeiten, indem sie ihnen ein bestimmtes Verhalten programmieren.

Objekte

Definition


Objekte sind Dinge, Lebewesen oder Sachverhalte in der uns umgebenden realen oder auch virtuellen Welt. Gleichartige Objekte werden unter einem Begriff zusammengefasst (siehe nächsten Absatz Kapitel).


Nehmen wir uns ein Beispiel am Objekt Schüler. Das Objekt hat verschiedene Attribute mit jeweiligen Attributwerten. In der ersten Zeile steht der Objektname, getrennt durch eine horizontale Linie folgen die Attribute mit ihren Attributwerten.

Krüger Objektkarte Schüler.png

Betrachten wir die geometrischen Körper Quader und Würfel. Jeder Körper baut sich aus 6 Flächen zusammen.
Wir erstellen uns ein Objekt "Fläche" mit zwei Attributen: Länge und Breite. Beide Attribute können verschiedene Werte annehmen.
Gibt es eine Möglichkeit aus 6 Objekten "Fläche" den Körper ...

... Würfel zu bauen, egal welche Werte die Attribute haben? (!ja) (nein)

... Würfel zu bauen, wenn alle Flächen gleich sind? (!ja ) (nein)

... Quader zu bauen, wenn gilt: 2 Flächen mit Länge = Breite = 4 cm, 4 Flächen mit Länge = 6 cm und Breite = 4 cm? (ja) (!nein)

Lösung

  • Gibt es eine Möglichkeit aus 6 Objekten "Fläche" den Körper Würfel zu bauen, egal welche Werte die Attribute haben? - Nein!

Begründung: Für den Bau eines Würfels müssen alle Flächen die gleiche Breite und Länge besitzen. Die Aufgabenstellung lässt eine Interpretation offen, bei der alle Flächen unterschiedlich sind, so dass kein Würfel gebaut werden kann.

  • Gibt es eine Möglichkeit aus 6 Objekten "Fläche" den Körper Würfel zu bauen, wenn alle Flächen gleich sind? - Nein!

Begründung: Ein Gegenbeispiel lässt sich leicht überlegen. Mit einer Länge = 3 cm und einer Breite = 5 cm lässt sich kein Würfel bauen.

  • Gibt es eine Möglichkeit aus 6 Objekten "Fläche" den Körper Quader zu bauen, wenn gilt: 2 Flächen mit Länge = Breite = 4 cm, 4 Flächen mit Länge = 6 cm und Breite = 4 cm? - Ja!

Begründung: Setzt man die 4 Flächen in einem Winkel von 90° an der Längskante (6 cm) zusammen, dann bildet sich mit den zwei anderen Flächen ein Quader.

Krüger Quader.png

Klasse

Sicherlich hast du in deinem Biologieunterricht verschiedene Tierarten behandelt. Genauso wie in der Tierwelt, werden in der Informatik Dinge mit gleicher Eigenschaft zu einer Klasse zusammengefasst. Wir können auch sagen, dass es das Grundgerüst eines (realen) Objektes ist. Dieses Grundgerüst gibt uns, wie bei den Objekten, bereits einige Attributfelder vor, die wir nun mit bestimmten Werten besetzen können. Mit dem Beispiel "Schüler" wollen wir uns folgenden Unterschied klarmachen:
Jeder Schüler ist auch ein Mensch, aber nicht jedes Mensch ist ein Schüler. Nehmen wir an, dass die Klasse "Mensch" schon existiert. Sie enthält schon Attribute , wie Name, Alter und Geschlecht. Andere Attribute, wie die Schule, müssen wir der Klasse "Schüler" selbst hinzufügen.

Ordne die Objekte in die richtigen Klassen ein!

Klasse: Tierarten Einzeller Vögel Säugetiere Wirbellose Tier
Klasse: Säugetiere Delfine Raubtiere Paarhufer
Klasse: Insekt Ameisen Flöhe Hornissen Schmetterlinge
Klasse: Nagetiere Biber Eichhörnchen Murmeltier

Bis jetzt haben wir uns nur mit den Objekten und Klassen beschäftigt. Um mit ihnen zu arbeiten, brauchen wir noch ein paar weitere Grundbegriffe aus der Informatik.

<language>Java</language>

Algorithmus

Les dir zuerst die Defintion des Begriffes durch, bevor du dir das Beispiel zum besseren Verständnis anschaust.

Definition


Ein Algorithmus ist eine Rechenvorschrift bei der in endlich vielen Schritten eine Aufgabe mit ausführbaren Anweisungen gelöst wird.


Im Alltag eines Schülers ist der Tagesbeginn mit einem Algorithmus zu vergleichen. Vom Aufstehen bis zum Erreichen der Schule ist das eine feste Vorschrift, welche täglich durchgeführt wird:

  1. Der Wecker klingelt.
  2. Der Wecker wird ausgeschalten und das Licht angeschaltet.
  3. Das Frühstück wird vorbereitet und anschießend gegessen.
  4. Im Bad Zähne putzen.
  5. Die Wohnung verlassen und per Bus/Bahn/Auto zur Schule fahren.
  6. Die Schule ist erreicht.


Die Konstruktion einer Mittelsenkrechten zwischen den Punkten A und B kann als Algorithmus aufgefasst werden. Sortiere die Schritte in der richtigen Reihenfolge ein.

  1. Schritt: Punkte A und B verbinden
  2. Schritt: Kreise um A und B mit passendem Radius
  3. Schritt: Schnittpunkte der Kreise verbinden

  public Object Mensch(String name) {

 meinName = name;
 String sagName() {
   return meinName;
 }
 return this;

}

public Object System() {

 WriteLine(String str) {
   System.out.println(str);
 }
 return this;

}

Object System = System(); <eval id="4b571e21c04dd"> // mit 'Object Max = Mensch("Mäxchen");' erzeugst du ein Objekt 'Max' von der Klasse 'Mensch' mit dem Namem 'Mäxchen' Object Fritz = Mensch("Fritzchen"); System.out.println(Fritz.sagName()); System.WriteLine(Fritz.sagName()); </eval> <check> return Mensch("Hase").sagName().equals("Hase"); </check>

Die Konstruktion einer Mittelsenkrechten zwischen den Punkten A und B kann als Algorithmus aufgefasst werden. Sortiere die Schritte in der richtigen Reihenfolge ein.
1. Schritt: Punkte A und B verbinden
2. Schritt: Kreise um A und B mit passendem Radius
3. Schritt: Schnittpunkte der Kreise verbinden

Exkurs: Diagramme

In beiden Algorithmen gibt es weitere Auffälligkeiten. Auf der einen Seite führt der Schüler Aktionen bzw. Tätigkeiten aus und auf der anderen Seite können wir den Schüler fragen stellen: Wie alt bist du? Hast du Hunger? In Zukunft wollen wir aus der Klasse "Schüler" Objekte erstellen und nennen sie schueler1, schueler2, usw.. Eine Aktion, die ein Klasse besitzt, wird Methode genannt. Methoden unterscheidet man in beobachtende und verändernde Methoden. Alle Methoden, die zu einer Klasse gehören, sind in der Objektkarte eingetragen.

Für den Schüler ergeben sich somit z.B. die verändernden Methoden schueler1.fruehstuecken(), schueler1. zaehnePutzen() und die beobachtbaren Methoden, schueler1.wieAltBistDu() (oder schueler1.getAlter()), schueler1.wieGrossBistDu() (oder schueler1.getGroesse(). Sie werden wie in der Grafik notiert.

Krüger Schüler.png

Im Quellcode sieht es in etwa so aus:

schueler1.weckerAusschalten();
schueler1.fruehstuecken();
  Aufgabe   Stift.gif

In der Objektkarte "Schüler" fehlen noch passende Methoden für einen Schüler. Erstelle dir selbst eine Objektkarte "Schüler" und ergänze fehlende sinnvolle Attribute mit Attributwerten sowie mindestens 3 Methoden!
Notiere sie auf deinem Laufzettel!

Es gibt verschiedene Lösungen für diese Aufgabe. Eine mögliche Objektkarte zeigt die Grafik.

Krüger Schüler Lösung.png


Vielleicht haben sich bei dir Probleme beim Erstellen der Objektkarte ergeben. Es ist leicht passende Attribute für ein Objekt zu definieren. Schwieriger wird es bei den Attributwerten. In der Beispiellösung steht im Attribut "größe" der Wert "171 cm". Wenn wir uns zu Beginn darauf einigen, dass im Attribut nur eine Zahl steht, die der Körpergröße in "cm" entspricht, dann können wir die Einheit beim Speichern vernachlässigen. So ähnlich funktioniert das auch mit anderen sog. Datentypen.

Datentyp

Es gibt folgende Datentypen für unsere Programmiersprache C#:

Typ Beschreibung Wertebereich
byte ganze Zahl -27, ..., 27-1 (-128, ...,127)
short ganze Zahl -215, ..., 215-1 (-32768, ...,32767)
int ganze Zahl -231, ..., 231-1 (-2 147 483 648, ...,2 147 483 647)
long ganze Zahl -263, ..., 263-1 (-9 223 372 036 854 775 808, ..., 9 223 372 036 854 775 807)
float Fließkommazahl -3,4028*1038, ..., 3,4028*1038
double Fließkommazahl -1,7977*10308, ..., 1,7977*10308
char einzelnes Zeichen alle (Unicode-) Zeichen, z.B. 'a','b',...,'A',...,'1',...,'?',...
string Zeichenkette mit beliebigen (Unicode-) Zeichen z.B. "Hallo!", "Schumacher, Michael", usw.
boolean Boole'scher Wert, der nur Wahr oder Falsch sein kann true, false

Fangen wir wir mit der kleinsten Einheit an: 1 Bit (wahr ist 1, falsch ist 0). 1 Byte entsprechen 8 Bit. Von dem Datentyp byte wissen wir, dass der Wertebereich eine Größe von -128 - 127 hat. Eine sinnvolle Verwendung dieses Datentyps wäre das Attribut "alter" des Objekts "Schüler", denn es ist sehr unwahrscheinlich, dass ein Schüler älter als 127 Jahre wird.

Vererbung

Im Fall unserer Klasse "Schüler" möchten wir uns nun mit dem Begriff der "Vererbung" beschäftigen. Wir wissen bereits, dass ein Schüler auch ein Mensch ist. Also können wir uns eine Klasse "Mensch" mit folgenden Attributen und Methoden erstellen:

  • Attribute: Name, Alter, Groesse, Geschlecht
  • Methoden: getAlter(), setAlter(), getGroesse(), setGroesse(), getGeschlecht

Um dieses Klasse "Mensch" zu spezifizieren, können wir uns eine neue Klasse "Schüler" erstellen, die alle Attribute und Methode von der Klasse "Mensch" erbt. In diesem Fall erbt die Unterklasse "Schüler" alle Eigenschaften der Oberklasse "Mensch". Zusätzlich fügen wir der Klasse "Schüler" folgende Attribute und Methoden hinzu:

  • Attribute: Schule, Klasse
  • Methoden: setSchule(), getSchule(), setKlasse(), getKlasse(),

Zum Schluss ist ein kleines Beispiel für eine Ober- und Unterklasse:

class Mensch
{
  private string Name;
  private byte Alter;
  private byte Groesse;
  private string Geschlecht;

  string getName()
  {
    return Name;
  }

  byte getAlter()
  { 
    return Alter;
  }

  void setAlter(byte neuesAlter) 
  { }

  byte getGroesse() 
  { 
    return Groesse;
  }

  void setGroesse(byte neueGroesse) 
  { }
 
  string getGeschlecht() 
  { 
    return Geschlecht;
  }
}

class Schüler : Mensch
{
  private string Schule;
  private string Klasse;

  string getSchule()
  { 
    return Schule;
  }

  void setSchule(string neueSchule)
  { }

  string getKlasse()
  {
    return Klasse;
  }

  void setKlasse(string neueKlasse)
  { }

  public Schüler() { }
}