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