Lektion 25:KlassenWenn Sie structs wie Arbeitnehmer{Adresse,Stundenlohl,Chef}, Adresse{Name,Straße,Hausnummer,Postleitzahl,Ort}, Auto{Leistung,Hubraum,Farbe} vergleichen, fällt auf, daß sie hier ausschließlich über die innenliegenden Variablen, die Attribute, definiert sind. Aber beim Programmieren möchte ich eigentlich nicht die Attribute sehen, sondern nur Funktionen.
Ob jetzt eine Uhrzeit mit Stunden und Minuten implementiert ist oder nur mit Minuten seit Mitternacht ist für mich unerheblich. Auch das Auto ließe sich vielleicht besser über die Methoden (Funktionen für einen Datentyp) definieren: Auto{kaufen, fahren, tanken, verkaufen, gegenEinenBaumFahren, verschrotten}. Jeder weiß, wie man ein Auto fährt, aber es ist doch dazu völlig unerheblich zu wissen, daß das Auto einen Motor hat. Es reicht zu wissen, daß es fährt. Wird ein Datentyp nur über seine Methoden definiert ist, dann ist es ein abstrakter Datentyp. Das heißt dann natürlich nicht, daß er keine Attribute hätte, sondern nur, daß die Attribute nur dem Hersteller bekannt sind, der Benutzer des Autos bekommt sie nicht zu sehen. Wenn wir einen Datentyp haben, zu dem auch Methoden gehören, dann nennen wir das eine Klasse. Und das war schon das wichtigste an der ganzen objektorientierten Programmierung: der Begriff Klasse. Über den Begriff Klasse muß aber noch einiges gesagt werden. Wir versuchen, irgendwelche Objekte aus der Außenwelt im Rechner abzubilden. So haben wir schon erfolgreich das Nimm-Spiel abgebildet. Wir müssen uns natürlich bewußt sein, daß nicht alle Aspekte abgebildet werden sollen. Das wäre auch nicht zweckdienlich. Beim Nimm-Spiel haben wir darauf verzichtet, die Münzen hübsch darzustellen, zu prüfen, ob jemand schummelt, und vieles mehr. Würden wir für ein betriebliches Abrechnungssystem Arbeitnehmer erfassen, dann müßten wir uns auf die Daten (Attribute) beschränken, die für unsere Anwendung notwendig sind, und darüber hinaus nach den örtlichen Datenschutzgesetzten verarbeitet werden dürfen. Und wir müßten uns überlegen, was mit den Arbeitnehmern geschehen kann, bzw. was Arbeitnehmer tun können (Methoden). Es wird weniger überlegt, wie die Außenwelt aussieht, sondern welches Modell für das Programm sinnvoll erscheint. Und dabei werden wir feststellen, daß alle Arbeitnehmer sehr viele Gemeinsamkeiten haben, z.B. die Methoden geburtstagsGrußSchicken, adresseAendern, kündigen. Wegen dieser Gemeinsamkeiten stecken wir die Arbeitnehmer in eine gemeinsame Klasse. Der Typ ist Arbeitnehmer, das ist die Klasse. Die konkreten Arbeitnehmer werden durch Variablen des Typs Arbeitnehmer dargestellt. Die Attribute und Methoden, die für alle Arbeitnehmer gelten, werden in die Klasse Arbeitnehmer geschrieben. Es gibt aber auch Unterschiede zwischen Arbeitnehmern, die nicht so einfach zu ignorieren sind. Die Löhne der Arbeiter werden ganz anders berechnet als die Gehälter der Angestellten. Daher ist es sinnvoll, die Methode auszahlen nicht in die Klasse Arbeitnehmer zu stecken. Statt dessen basteln wir zwei neue Klassen, die Arbeiter und die Angestellten. Wir definieren ferner, daß alle Arbeiter auch Arbeitnehmer und alle Angestellten auch Arbeitnehmer sind. Das heißt konkret, daß jedes Attribut und jede Methode von Arbeitnehmer auf die beiden Unterklassen vererbt wird. Das nennt sich Vererbung. Nur die Methode auszahlen ist unterschiedlich. Aber sie wird genau gleich aufgerufen. Ich kann in einer Liste Arbeitnehmer verwalten, ohne mich dafür zu interessieren, ob es Arbeitnehmer oder Angestellte sind. Und wenn dann der Zahltag kommt, dann wird auf jedes Element dieser Liste die Methode auszahlen aufgerufen. Dabei wird für die Arbeiter der Lohn und für die Angestellten mit einer völlig anderen Methode (gleichen Namens) das Gehalt berechnet. Aber mich als Programmierer kümmert dieser Unterschied nicht. Das gleiche Aussehen unterschiedlicher Methoden nennt sich Polymorphie. Dadurch muß der Programmierer nicht mehr auf so viele Details achten, was den Code wesentlich einfacher macht. Für solche trivialen Tätigkeiten, wie jeweils nachzuschauen, welchen Typ eine Variable hat, und dann die richtige Methode aufzurufen, ist wirklich der Rechner da. Außerdem ist es natürlich möglich, der Klasse Arbeiter noch ein paar Attribute oder Methoden zu verpassen, die nur die Arbeiter haben, z.B. Stücklohn. Übung:Sollte Kreis von Ellipse erben oder sollte Ellipse von Kreis erben oder keines von beiden? Einsendungen:LösungsvorschlagFalls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern. [aktuelle Version] [inhalt] [index] [Fehlerkorrektur, Verbesserungsvorschlag] © Volkard Henkel <volkard@normannia.de>, last update: 08/25/00 |