/* * Klassen sind eine Vereinigung von Daten und der Art wie diese auf * messages reagieren. Oft reagieren Sie auf eine message identisch, aber * die Details koennen variieren. Ein beispiel dafuer waere die message * "fahre an einen bestimmten Ort". Die meisten Objekte die auf diese * message reagieren koennen brauchen dafuer ein Rad...ein Luftschiff * allerdings faehrt auch (sprachliche definition) benoetigt dafuer aber * kein Rad. Das Ergebnis der message ist allerdings das gleiche wenn * alles korrekt functioniert. Das Objekt erreicht das definierte Ziel. * * Was wir unter C tun müssen ist separate definition von Interface und * und Daten sowie Methoden....das Interface ist dabei immer verantwortlich * dafür die zur Klasse gehörende Implementation einer Methode aufzurufen. * * In anderen Worten... eine Klasse ist eine konkretisierung eines * Interface. Ebenso wie es viele Objekte einer Klasse geben kann, kann es * auch viele Konkretisierungen eines Interfaces geben. * * Alle Klassen die das gleiche Interface konkretisieren reagieren auf * die gleichen Messages und Objekte dieser Klassen sind daher grundsätzlich * austauschbar. * * Ein Interface kann ebenso wie Klassen andere Interfaces erweitern. * Objekte von Klassen die ein solches erweitertes Interface konkretisieren * koennen auch überall dort eingesetzt werden wo Objekte des Basisinterface * eingesetzt wurden. * * Alles Interfaces müssen wenigstens von dem Basisinterface struct _CCLASS * abgeleitet sein, welches __construct und __destruct sowie class detection * Magic und die Klassengroesse enthält. * * Die Interfaces können zur compilezeit statisch initialisiert werden da * sie sich zur laufzeit nie ändern. * * Über die implementierung multipler interfaces muss ich noch nachdenken. * Denkbar waere den Interfaces reservierte namen zu geben über die dann immer * auf sie zugegriffen werden muss...hat eine Interfacedefinition dann ein * memder dieses reservierten namens hat er auch das Interface. * * === was folgt ist noch nicht in unten stehendem pseudo code === * * Die interfaces sollten sich evtl nicht extenden....stattdessen * sollte die Klassenimplementation ihr interface mit den existierenden * Interface definitionen und ihren implementationen initialisieren. * * Das soll heissen zu jeder Klasse (A) wird auch eine Interfaces structur * angelegt die dann konkrete Interface Instanzen initialisiert und mit * einem unique name versieht. * * Dabei ist dann verprflichtend das zumindest das CCLASS interface * eingebunden wird, damit es wirklich eine Klasse wird. :) */ // === INTERFACE DEFINITION ======= typedef void (*fptr_draw)(void *); typedef struct __SHAPE { struct _CCLASS cclass; struct { fptr_draw draw; } shape; } * __SHAPE_PTR; struct _SHAPE; typedef struct _SHAPE * SHAPE; // === INTERFACE IMPLEMENTIERUNG (for dynamic binding) ======= void * draw(const __SHAPE_PTR shape) { const __SHAPE_PTR class = _object - sizeof(void *); if (shape && class && class->draw) { class->draw(shape); } } // === KLASSEN INITIALIZATION ======== static void draw(CIRCLE * this); static const struct __SHAPE _circle = { { CCLASS_MAGIC; sizeof(struct __SHAPE); __construct; NULL; __destruct; NULL; NULL; }; { draw; } }; static void draw(CIRCLE * this) { /* draw the shape */ } // vim: set ts=4 sw=4: