Commit eaeb0983232d6c447714dc7746443f5bfc297fd9
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
doc/cclass-thoughts.c
0 → 100644
| 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