alias this & cast
    Ali Çehreli via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Thu Sep 11 10:07:57 PDT 2014
    
    
  
On 09/11/2014 09:18 AM, andre wrote:
 > I am not sure. b is C but everything not in super class B is hidden.
 > Using cast I can cast b to a full C.
 >
 > The cast "cast(C)b" has the same information about b like the cast
 > "cast(A)b": The memory area of b knows compatitibility to C and also the
 > alias.
That's only because 'b' really is a C.
 > For me, using alias this, the object b has 3 represenations: A, B and C.
Correct but it cannot be known whether any B is an A:
void foo(B b)
{
     // ...
}
Can that 'b' used as an A? Who knows...
It may be desirable that the compiler did static code analysis and saw 
that the 'b' in your code is always a C, therefore can be casted to an 
A. Compilers do not and most of the time cannot do that.
Consider one line added to you program:
 >>> class A{}
 >>>
 >>> class B{}
 >>>
 >>> class C : B
 >>> {
 >>>     A a;
 >>>     alias a this;
 >>>
 >>>     this()
 >>>     {
 >>>         a = new A();
 >>>     }
 >>> }
 >>>
 >>> void main()
 >>> {
 >>>     B b = new C();
Add this:
     takesBbyReference(b);
Now nobody knows whether the object has changed to something other than 
C. For example:
class Z : B
{}
void takesBbyReference(ref B b)
{
     b = new Z;
}
Now the first assert fails as well:
 >>>     assert(cast(C)b);
Ali
    
    
More information about the Digitalmars-d-learn
mailing list