Commit eaeb0983232d6c447714dc7746443f5bfc297fd9

Authored by Georg Hopp
1 parent f366c0b8

added some valueable thought about cclass and how this structure might evolve to a real class

Showing 1 changed file with 98 additions and 0 deletions
  1 +/*
  2 + * Was wir unter C tun müssen ist separate definition von Interface und
  3 + * und Daten sowie Methoden....das Interface ist dabei immer verantwortlich
  4 + * dafür die zur Klasse gehörende Implementation einer Methode aufzurufen.
  5 + *
  6 + * In anderen Worten... eine Klasse ist eine konkretisierung eines
  7 + * Interface. Ebenso wie es viele Objekte einer Klasse geben kann, kann es
  8 + * auch viele Konkretisierungen eines Interfaces geben.
  9 + *
  10 + * Alle Klassen die das gleiche Interface konkretisieren reagieren auf
  11 + * die gleichen Messages und Objekte dieser Klassen sind daher grundsätzlich
  12 + * austauschbar.
  13 + *
  14 + * Ein Interface kann ebenso wie Klassen andere Interfaces erweitern.
  15 + * Objekte von Klassen die ein solches erweitertes Interface konkretisieren
  16 + * koennen auch überall dort eingesetzt werden wo Objekte des Basisinterface
  17 + * eingesetzt wurden.
  18 + *
  19 + * Alles Interfaces müssen wenigstens von dem Basisinterface struct _CCLASS
  20 + * abgeleitet sein, welches __construct und __destruct sowie class detection
  21 + * Magic und die Klassengroesse enthält.
  22 + *
  23 + * Die Interfaces können zur compilezeit statisch initialisiert werden da
  24 + * sie sich zur laufzeit nie ändern.
  25 + *
  26 + * Über die implementierung multipler interfaces muss ich noch nachdenken.
  27 + * Denkbar waere den Interfaces reservierte namen zu geben über die dann immer
  28 + * auf sie zugegriffen werden muss...hat eine Interfacedefinition dann ein
  29 + * memder dieses reservierten namens hat er auch das Interface.
  30 + *
  31 + * === was folgt ist noch nicht in unten stehendem pseudo code ===
  32 + *
  33 + * Die interfaces sollten sich evtl nicht extenden....stattdessen
  34 + * sollte die Klassenimplementation ihr interface mit den existierenden
  35 + * Interface definitionen und ihren implementationen initialisieren.
  36 + *
  37 + * Das soll heissen zu jeder Klasse (A) wird auch eine Interfaces structur
  38 + * angelegt die dann konkrete Interface Instanzen initialisiert und mit
  39 + * einem unique name versieht.
  40 + *
  41 + * Dabei ist dann verprflichtend das zumindest das CCLASS interface
  42 + * eingebunden wird, damit es wirklich eine Klasse wird. :)
  43 + */
  44 +
  45 +// === INTERFACE DEFINITION =======
  46 +
  47 +typedef void (*fptr_draw)(void *);
  48 +
  49 +typedef struct __SHAPE {
  50 + struct _CCLASS cclass;
  51 + struct {
  52 + fptr_draw draw;
  53 + } shape;
  54 +} * __SHAPE_PTR;
  55 +
  56 +struct _SHAPE;
  57 +typedef struct _SHAPE * SHAPE;
  58 +
  59 +// === INTERFACE IMPLEMENTIERUNG (for dynamic binding) =======
  60 +
  61 +void * draw(const __SHAPE_PTR shape)
  62 +{
  63 + const __SHAPE_PTR class = _object - sizeof(void *);
  64 +
  65 + if (shape && class && class->draw) {
  66 + class->draw(shape);
  67 + }
  68 +}
  69 +
  70 +// === KLASSEN IMPLEMENTATION ========
  71 +
  72 +static void draw(CIRCLE * this);
  73 +
  74 +static
  75 +const
  76 +struct __SHAPE _circle = {
  77 + {
  78 + CCLASS_MAGIC;
  79 + sizeof(struct __SHAPE);
  80 + __construct;
  81 + NULL;
  82 + __destruct;
  83 + NULL;
  84 + NULL;
  85 + };
  86 + {
  87 + draw;
  88 + }
  89 +};
  90 +
  91 +static
  92 +void
  93 +draw(CIRCLE * this)
  94 +{
  95 + /* draw the shape */
  96 +}
  97 +
  98 +// vim: set ts=4 sw=4:
... ...
Please register or login to post a comment