September 14, 2003 covariance in data members | ||||
---|---|---|---|---|
| ||||
Is there a chance this could ever work? class A {} class B:A {} class C { A component; A getComponent() { return component; } } class D:C { B component; } void main() { B b=new B; D d=new D; d.component=b; // 1 printf("%.*s\n",d.getComponent().classinfo.name); // 2 } Put like this, I get an access violation in 2. If I change 1 to d.C.component=b; then it works fine. But I don't want nor that neither to override getComponent for each derivation of C. ------------------------- Carlos Santander --- Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.516 / Virus Database: 313 - Release Date: 2003-09-01 |
September 14, 2003 Re: covariance in data members | ||||
---|---|---|---|---|
| ||||
Posted in reply to Carlos Santander B. | Carlos Santander B. wrote:
> Is there a chance this could ever work?
>
> class A {}
> class B:A {}
>
> class C {
> A component;
> A getComponent() { return component; }
> }
>
> class D:C {
> B component;
> }
>
> void main() {
> B b=new B;
> D d=new D;
> d.component=b; // 1
> printf("%.*s\n",d.getComponent().classinfo.name); // 2
> }
>
> Put like this, I get an access violation in 2. If I change 1 to
> d.C.component=b; then it works fine. But I don't want nor that neither to
> override getComponent for each derivation of C.
you will do the layout of D is
D{
C{
B{
A{
// a has no members
}
// B has no members
}
A component; // visible to C.getComponent
}
B companent; // new member (not change if the type of C.component;
it is this item that d.component refers to
}
allowing D to redefine the class of `component` would require a `write barrier` in C to stop the following occuring
void func( C c, A a ) { c.componant = a; }
D d; func( d, new A() ); // would attempt to write an A to a B!
you can do ....
class C {
private A comp;
public void setComp( A c ) { comp = c; }
public A getComp() { return comp; }
}
class D:C {
public void setComp( A c )
in {
if ( c !== null ) {
B b = cast(B)c
assert( b );
}
}
body {
super.setComp( c );
}
public B getComp() { return cast(B)super.getComp(); }
}
|
Copyright © 1999-2021 by the D Language Foundation