-
Notifications
You must be signed in to change notification settings - Fork 3
/
doublederived.c
78 lines (67 loc) · 2.35 KB
/
doublederived.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "doublederived.h"
#include <stdio.h>
#include <stdlib.h>
// Prototypes
void* doublederived_get_interface_impl(void * iface_type);
void doublederived_mymethod_impl(Derived* b, int z);
void doublederived_draw_impl (void* obj, int x, int y);
void doublederived_draw_impl (void* obj, int x, int y);
void doublederived_finalize_impl(Object * obj);
void doublederived_draw_impl (void* obj, int x, int y)
{
printf("doublederived draw %d,%d\n", x, y);
}
void doublederived_redraw_impl (void* obj, int x, int y)
{
printf("doublederived redraw %d,%d\n", x, y);
}
void
doublederived_display(DoubleDerived* dd)
{
printf("k=%d\n", dd->k);
//printf("e = %3.2f, pi = %3.2f, x = %d\n", dd->parent.e, dd->parent.pi, dd->parent.x);
derived_display(&dd->parent);
}
void
doublederived_init(DoubleDerived* ref, int x, double pi, double e, int q, int k)
{
derived_init(&ref->parent, x, pi, e, q);
SET_INSTANCE_TYPE(ref, DOUBLEDERIVED_TYPE);
ref->k= k;
}
DoubleDerivedClass*
doublederived_get_class()
{
static DoubleDerivedClass* class_structure = NULL;
if (!class_structure) {
class_structure = (DoubleDerivedClass*) malloc(sizeof(DoubleDerivedClass));
EXTENDS(class_structure, DERIVED_TYPE)
DECLARE_INTERFACE_DISPATCHER_OVERRIDE(class_structure, doublederived_get_interface_impl)
// Override methods, declare static fields
DECLARE_METHOD_OVERRIDE(AS_OBJECT_TYPE(class_structure), finalize, doublederived_finalize_impl)
DECLARE_METHOD_OVERRIDE(AS_DERIVED_TYPE(class_structure), mymethod, doublederived_mymethod_impl)
DECLARE_METHOD_OVERRIDE(AS_IDRAWABLE_TYPE(&class_structure->drawable), draw, doublederived_draw_impl)
DECLARE_METHOD_OVERRIDE(AS_IDRAWABLE_TYPE(&class_structure->drawable), redraw, doublederived_redraw_impl)
}
return class_structure;
}
void
doublederived_mymethod_impl(Derived* d, int z)
{
printf("doublederived_mymethod_impl called with z=%d\n", z);
}
void
doublederived_finalize_impl(Object * obj)
{
printf("Finalizing DoubleDerived object\n");
AS_OBJECT_TYPE(DERIVED_TYPE)->finalize(obj); // Chain
}
void*
doublederived_get_interface_impl(void * iface_type)
{
if (iface_type == IDRAWABLE_TYPE) {
return &doublederived_get_class()->drawable;
}
// Chain
return AS_OBJECT_TYPE(PARENT_TYPE(DOUBLEDERIVED_TYPE))->get_interface(iface_type);
}