blob: 556e11b39baf129ee48a726e92d89a3697d54527 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001shadow()
2========
3
4FUNKTION
5--------
6::
7
8 object shadow(object ob, int flag)
9
10ARGUMENTE
11---------
12::
13
14 object ob - das vom shadow betroffene Objekt
15 int flag - 0 fuer eine Shadow-Existenzabfrage
16 1 fuer Shadow durch previous_object()
17
18BESCHREIBUNG
19------------
20::
21
22 Wenn <flag> nicht 0 ist, wird das aktuelle Objekt dem Objekt obj
23 als Shadow uebergeworfen. Bei Erfolg wird das geshadowte Objekt
24 zurueckgegeben, sonst 0.
25 Wenn <flag> 0 ist, wird entweder 0 oder das geshadowte Objekt
26 zurueck gegeben.
27
28 Wenn ein Objekt A ein Objekt B beschattet, werden alle call_other() fuer
29 B auf A umgeleitet. Wenn die an B gerufene Funktion in A existiert, so
30 wird sie in A gerufen, bei Nichtexistenz in B.
31 A ist das einzige Objekt, welche die beschatteten Funktionen mit
32 call_other() in B aufrufen kann, selbst B kann nicht per call_other()
33 diese Funktion rufen.
34 Alle intern verwendeten Funktionen arbeiten jedoch weiterhin normal.
35
36 Das aufrufende Objekt muss vom Master-Objekt die Erlaubnis haben,
37 als Shadow zu wirken.
38
39 Es gibt folgende Kriterien fuer eine erfolgreiche Beschattung:
40 - das zu beschattende Objekt ob:
41 - ist weder ein access_rights-Objekt noch ein ROOT-Objekt
42 - gibt beim Aufruf von query_prevent_shadow(beschatter) eine 0
43 zurueck
44 - beschattet selbst niemanden
45 - hat kein '#pragma no_shadow' gesetzt
46 - der Beschatter:
47 - wird nicht selbst (direkt) beschattet
48 - beschattet noch niemanden (sonst folgt direkter Abbruch)
49 - hat kein environment()
50 - definiert/beschattet keine Methode, die im beschatteten Objekt ob
51 als nomask definiert ist
52
53 Beschattet man ein Objekt A mit einem Objekt B und dann das Objekt A
54 zusaetzlich mit einem Objekt C, so wird eine Beschattungshierarchie
55 erstellt:
56
57 B macht shadow(A, 1)
58 B->A
59 C macht shadow(A, 1)
60 C->B->A
61
62BEISPIELE
63---------
64::
65
66 // wenn: B beschattet A, dann
67 shadow(find_object(A), 0) == B
68
69
70 // 3 Objekte beschatten in Hierarchie (liegt auch im Pfad)
71 --- aa.c ---
72 void fun() {
73 printf("%O [a] fun()\n", this_object());
74 }
75
76 void fun3() {
77 printf("%O [a] fun3()\n", this_object());
78 }
79
80 --- bb.c ---
81 int fun() {
82 printf("%O [b] fun()\n", this_object());
83 find_object("/doc/beispiele/shadow/aa")->fun();
84 }
85
86 void fun2() {
87 printf("%O [b] fun2()\n", this_object());
88 find_object("/doc/beispiele/shadow/aa")->fun3();
89 this_object()->fun3();
90 }
91
92 void do_shadow(object target) { shadow(target, 1); }
93
94 --- cc.c ---
95 int fun() {
96 printf("%O [c] fun()\n", this_object());
97 find_object("/doc/beispiele/shadow/aa")->fun();
98 }
99
100 void fun3() {
101 printf("%O [c] fun3()\n", this_object());
102 }
103
104 void do_shadow(object target) { shadow(target, 1); }
105
106 // darauf arbeitender Code
107
108 object a, b, c;
109
110 destruct("/doc/beispiele/shadow/aa");
111 a = load_object("/doc/beispiele/shadow/aa");
112 destruct("/doc/beispiele/shadow/bb");
113 b = load_object("/doc/beispiele/shadow/bb");
114 destruct("/doc/beispiele/shadow/cc");
115 c = load_object("/doc/beispiele/shadow/cc");
116
117 b->do_shadow(a);
118 c->do_shadow(a);
119 printf("--- a->fun() ---\n");
120 a->fun();
121 printf("--- b->fun() ---\n");
122 b->fun();
123 printf("--- c->fun() ---\n");
124 c->fun();
125 printf("--- b->fun2() ---\n");
126 b->fun2();
127
128 // ... und seine Ausgabe:
129
130 --- a->fun() ---
131 /doc/beispiele/shadow/cc [c] fun()
132 /doc/beispiele/shadow/bb [b] fun()
133 /doc/beispiele/shadow/aa [a] fun()
134 --- b->fun() ---
135 /doc/beispiele/shadow/cc [c] fun()
136 /doc/beispiele/shadow/bb [b] fun()
137 /doc/beispiele/shadow/aa [a] fun()
138 --- c->fun() ---
139 /doc/beispiele/shadow/cc [c] fun()
140 /doc/beispiele/shadow/bb [b] fun()
141 /doc/beispiele/shadow/aa [a] fun()
142 --- b->fun2() ---
143 /doc/beispiele/shadow/bb [b] fun2()
144 /doc/beispiele/shadow/aa [a] fun3()
145 /doc/beispiele/shadow/cc [c] fun3()
146
147 // Der erste Aufruf von b::fun2() in a findet sofort a::fun3()! Der
148 // Driver nimmt an, dass alle Shadows ab c bei Rufen von b nach a
149 // schon ihre Chance hatten.
150 // Der zweite Aufruf allerdings ist auf b und wird beim Durchgeben
151 // an a von c uebernommen.
152
153SIEHE AUCH
154----------
155::
156
157 Generell: shadow(E)
158 Rechte: query_allow_shadow(M), query_prevent_shadow(L)
159 Informationen: query_shadowing(E)
160
1618.Aug 2007 Gloinson
162