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

Reply via email to