Browse Source
added some valueable thought about cclass and how this structure might evolve to a real class
master
added some valueable thought about cclass and how this structure might evolve to a real class
master
1 changed files with 98 additions and 0 deletions
@ -0,0 +1,98 @@ |
|||
/* |
|||
* 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 IMPLEMENTATION ======== |
|||
|
|||
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: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue