1
2 extern(C) int printf(const char*, ...);
3
4 /*******************************************/
5
6 interface D {
7 int foo();
8 }
9
10 class A : D {
foo()11 int foo() { return 1; }
12 }
13
14 class B : A, D
15 {
foo()16 override int foo() { return 2; }
17 }
18
19 class C : B, D {
foo()20 override int foo() { return 3; }
21 }
22
test1()23 void test1()
24 {
25 C c = new C;
26 A a = cast(A) c;
27 int j = a.foo();
28 printf("%d\n", j);
29 assert(j == 3);
30
31 B b = cast(B) c;
32 int k = b.foo();
33 printf("%d\n", k);
34 assert(k == 3);
35
36 D d1 = cast(D) c;
37 int l = d1.foo();
38 printf("%d\n", l);
39 assert(l == 3);
40
41 D d2 = cast(D) b;
42 int m = d2.foo();
43 printf("%d\n", m);
44 assert(m == 3);
45 }
46
47
48 /*******************************************/
49
50 interface D2 {
51 int foo();
52 }
53
54 class A2 : D2 {
foo()55 int foo() { printf("A2\n"); return 1; }
56 }
57
58 class B2 : A2 {
foo()59 override int foo() { printf("B2\n"); return 2; }
60 }
61
62 class C2 : B2, D2 {
foo()63 override int foo() { printf("C2\n"); return 3; }
64 }
65
test2()66 void test2()
67 {
68 int i;
69
70 C2 c = new C2;
71 D2 d = cast(D2)c;
72 i = c.foo();
73 assert(i == 3);
74
75 i = d.foo();
76 assert(i == 3);
77
78 B2 b = new B2;
79 if (cast(D2) b)
80 {
81 D2 e = cast(D2) b;
82 i = e.foo();
83 assert(i == 2);
84 }
85 else
86 assert(0);
87
88 A2 a;
89 if (cast(D2) a)
90 assert(0);
91 }
92
93
94 /*******************************************/
95
96 interface C3
97 {
98 int doLayout();
99 }
100
101 class A3
102 {
print()103 void print() { printf("A3::print\n"); }
104 }
105
106 class B3 : A3, C3
107 {
doLayout()108 int doLayout() { printf( "B3::doLayout\n" ); return 17; }
109 }
110
callLayout(A3 b)111 void callLayout(A3 b)
112 {
113 printf("b = %p\n", b);
114 C3 cl = cast(C3)b;
115 printf("cl = %p\n", cl);
116 if (cl)
117 { int i;
118
119 i = cl.doLayout();
120 assert(i == 17);
121 }
122 else
123 { printf("the 'A3' you passed did not implement 'C3'\n" );
124 assert(0);
125 }
126 }
127
test3()128 void test3()
129 {
130 callLayout(new B3());
131 }
132
133
134 /*******************************************/
135
136
IContainer(T)137 template IContainer(T)
138 {
139 interface IContainer
140 {
141 alias Container!(int) selected_type;
142 bool isEmpty();
143 int enumerate();
144 }
145 }
146
Container(T)147 template Container(T)
148 {
149 class Container : IContainer!(int)
150 {
151 bool isEmpty() { return false; }
152 int enumerate() { return 3; }
153 }
154 }
155
Vector_test_IContainer_int()156 void Vector_test_IContainer_int()
157 {
158 alias IContainer!(int) icontainer_t;
159 }
160
test4()161 void test4()
162 {
163 }
164
165 /*******************************************/
166
167
Italy(T)168 interface Italy(T)
169 {
170 alias Foo5!(int) selected_type;
171 bool isempty();
172 int enumerate();
173 }
174
175 class Foo5(T) : Italy!(int)
176 {
isempty()177 bool isempty() { return false; }
enumerate()178 int enumerate() { return 3; }
179 }
180
test5()181 void test5()
182 {
183 alias Italy!(int) Ic;
184 Foo5!(int) f = new Foo5!(int);
185 Ic i = cast(Ic)f;
186 assert(i.isempty() == false);
187 assert(i.enumerate() == 3);
188 }
189
190
191 /*******************************************/
192
main(char[][]args)193 int main (char[][] args)
194 {
195 test1();
196 test2();
197 test3();
198 test4();
199 test5();
200
201 printf("Success\n");
202 return 0;
203 }
204