Left Up Right Philosophische Grundlagen der objektorientierten Programmierung

Generalisierung und Spezialisierung

Subordination: Es werden einem oder mehreren Begriffen einem Oberbegriff untergeordnet.
Dieses Verhältnis wird auch Art-Gattungsbeziehung genannt.
Beispiele:
Betriebswirtschaft:
Mitarbeiter ist eine Person
Kunde ist eine Person
Biologie
Pferd ist ein Säugetier Hund ist ein Säugetier
...
Formal:
 Für alle x : U → x : O
Zum Herausarbeiten gibt es zwei Vorgehensweisen:
Generalisierung
Aus mehreren Begriffen/Klassen wird das Gemeinsame herausgearbeitet (konkret→ abstrakt , bottom up)
Spezialisierung
Ein bekannter Begriff/Klasse wird verfeinert (abstrakt→konkret, top down)

Antike Definitionslehre

([Wede92] S 31)
  1. Man lege erst die Gattung fest (genus proximum)
  2. Man finde des Artbildenden Unterschied (differentia specifica)
Spezifizieren heißt übersetzt: Art bilden.
Dadurch entsteht der weltgliedernde Baum "Abor porphyriana"
Hier wird die Gliederung der Welt dogmatisch vorrausgesetzt.

Gliederung der Welt nach Aristoteles:

(seelenlose Objekte unterliegen keiner Veränderung)

Sehr schön macht das die Biologie: Sie teilt die Lebewesen in Stamm,Klasse,Ordnung,Familie, Gattung, und Art ein. ([UML99] S 62)

Untertypbildung

Hier kommt es auf die Ersetzbarkeit an (Liskov-Substitution Principle)):
Einen Untertyp kann man da einsetzen, wo sein Obertyp erwartet wird.

Vererbung

Vererbung ist konstitutiv für die Objektorientierte Programmierung Ohne Vererbung nennen wir eine Sprache/System objektbasiert.

Def Vererbung: Vererbung im allgemeinsten Sinne ist ein Mechanismus zur Wiederverwendung von Software.

Bei klassenbasierten Programmiersprachen erbt eine Klasse von einer anderen, was sich dadurch auswirkt, daß die in der Oberklasse definierten Attribute und Methoden von der Unterklasse übernommen werden. Beispiel:

class Person
{
public:
  String name,vorname;
};

class Mitarbeiter : public Person
{
public:
  Betrag gehalt();
  erhoehegehalt();
  entlassen();  
};

class Manager : public Mitarbeiter
{
};

class Geschaeftspartner : public Person
{
};

class Kunde : public Geschaeftspartner
{
};

class Lieferant: public Geschaeftspartner
{
};
Vererbung und Typhierarchie müssen nicht immer Zusammenfallen: Beispiel aus Graphik/Geometrie: Circle-Ellipse-Problem: Ein Kreis ist eine Ellipse, d.h. überall wo ich eine Ellipse erwarte, kann man auch einen Kreis einsetzen (Brennpunkte fallen zusammen) Vererbungsmäßig kann man eine Ellipse aus einem Kreis erweitern
class Kreis
{
public:
 Punkt mittelpunkt;
 double radius;
};

class Ellipse: Kreis
{
public:
  Punkt brennpunkt1 { return mittelpunkt; }
  Punkt brennpunkt2
  ...
};
Z.B. in C++ wird dem dadurch Rechnung getragen, daß wenn das Schlüsselwort public bei der Vererbungsspezifikation angegeben wird, gleichzeitig eine Untertypbeziehung deklariert wird.

Dies war die Diskussion 1990. Heute (2013) wird die Vererbung als Wiederverwendung der Implementierung nicht mehr als so wichtig eingestuft. Wichtig ist nach wie vor das Liskov-Substitutionsprinzip: Ein Kreis ist hier ein Spezialfall einer Ellipse (Wenn eine Operation einen Kreis erwartet, darf keine allgemeine Ellipse kommen.)

Ein gutes Design schaut sich also die Hierarchie aus sich der Verwendung an.

Mehrfache Vererbung und mehrfache Typbeziehung

Eine Klasse kann aus mehreren Klassen erben bzw. ein Untertyp von mehreren Obertypen sein.
Formal:
  Für alle x:G → x:O1 und x:O2
Dies wird aber von verschiedenen Programiersprachen unterschiedlich gehandhabt: Beispielsweise ist in JAVA nur die mehrfache Untertypbeziehung erlaubt, nicht aber die mehrfache Vererbung. In C++ dagegen ist beides erlaubt.

Beispielsweise:

class Fahrzeug 
{};

class Blaulichtrechte
{};

class Krankenwagen : public Fahrzeug,public Blaulichtrechte
{
};
Problematisch ist, wenn Klassen auf verschiedenen Vererbungspfaden eine gemeinsame Oberklasse erben. Diese kann einmal oder mehrfach geerbt werden.

Intension und Extension von Begriffen,Typen/Klassen

Die Ober-begriffe/Typen/Klassen nennt man Intension.

Die Unter-begriffe/Typen/Klasse sowie alle Exemplare nennt man Extension.

Datenbanksysteme, Betriebssysteme und Netzwerke behandeln im wesentlichen nur die Extension und kümmern sich nicht um den Inhalt. Daher sind sie auch universell einsetzbar.


Informatik- und Netzwerkverein Ravensburg e.V Rudolf Weber