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