hijacking a class's members
Rory Mcguire
rjmcguire at gm_no_ail.com
Wed Aug 4 03:11:34 PDT 2010
Hi,
The code below is my beginning to attempt a class which implements any class
and throws an exception if one tries to access any member of that class.
Problem is that if I use:
auto a1 = noinit!(A)();
it works and accesses the int x() {...} member of the generated class, but
if I use:
A a1 = noinit!(A)();
it accesses A.x instead of the generated classes x.
So am I wrong in making a sub class have a member function which hides a
parent class's member variable or is the compiler wrong and it should
generate a call to generated sub class?
Thanks!!!
-Rory
================================================
import std.algorithm;
import std.contracts;
import std.traits;
class A {
int x;
}
string thrower(T)(string name) {
static if (isNumeric!T) {
return "@property ref "~ T.stringof ~" "~ name ~"() {
throw new Exception(\"Uninitialized access!\"); }"
"@property ref "~ T.stringof ~"
"~ name ~"(int ignored) { throw new Exception(\"Uninitialized access\"); }";
} else {
return "error";
}
}
string build(alias T, alias generator)(string myname) {
string s = "auto "~ myname ~" = new class "~T.stringof~" {
invariant() { throw new Exception(\"inv\");}\n";
foreach (i,t; typeof(T.tupleof)) {
string name = find(T.tupleof[i].stringof, '.');
enforce(name.length >= 2);
name = name[1..$];
//pragma(msg, t," ", A.tupleof[i]);
s ~= "\t"~generator!t(name) ~"\n";
}
return s~ "};";
}
auto noinit(alias T)() {
mixin(build!(T,thrower)("tmp"));
return tmp;
}
void main() {
A a = noinit!(A)();
auto a1 = noinit!(A)();
// pragma(msg, build!(A,thrower)("Athrower"));
int i = a.x = 3; // uses A.x not the generated ??.x
int j = a1.x = 3; // uses ??.x
assert(a.x == 3);
}
More information about the Digitalmars-d-learn
mailing list