Thats what feels weird to me. a.x can result in different things happening
even though x exists in both A and the generated class. However the
generated class has two "fields" called x one you can't access anymore and
the @property one.
When I create an instance of the generated class I would expect it to always
to the same thing if I use one of its methods/properties/etc...
Kind of like you would expect the following to print out "hello 2":
class A {
string toString() { return "hello"; }
}
class B : A {
string toString() { return super.toString() ~ " 2"; }
}
void main() {
A a = new B();
writeln(a.toString()); // uses B.toString()
}
What I've got is:
class A {
int x;
}
class B : A {
int x() { throw new Exception(); }
}
void main() {
A a = new B();
writeln(a.x); // this accesses A.x not B.x!!!!
}
just seems like properties are not quite right or something.
-Rory
If you want that to work, both x have to be virtual (ie dynamically
bound). In D all non-final non-ststic clsss-methods are virtual(1).
Consider the following:
///////
class A {
int x = 0;
int getX() { //<-- it's virtual
return x;
}
}
class B : A{
int x = 5;
override int getX() { //<-- it's virtual too
return x;
}
}
void thinAboutA(A a) {
/* Now a call to a non virtual method
* which results in vtbl lookup. a's vtbl
* contains B.getX().
writeln(a.getX());
/* Non virtual field.
* Has to be statically bound
* to a lookup in A.x
*/
writeln(a.x);
}
void main() {
thinkAboutA(new B);
}
////////
Fields have to be statically bound bcause the compiler doesn't enforce
covariance with fields. So you can:
///////////////
class C : A {
string x = "";
}
void main() {
thinkAboutA(new C); //Should evrything crash now? I won't.
}
//////////////
1) I'm not sure about @propertys.