D casting broke?

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jun 20 03:38:12 PDT 2016


On 06/20/2016 01:40 AM, Joerg Joergonson wrote:
> public class Button(T : ButtonItem) : Widget { ... }
> public class ButtonItem : Item
> {
>   void Do() { auto parent = (cast(Button!ButtonItem)this.Parent); }
>   ...
> }
>
> All this works great! As long as Do is not being called from a derived
> class
>
> public class Slider(T : SliderItem) : Button!T { }
> public class SliderItem : ButtonItem { }
>
>
> The last two classes are truly empty. Now, when I use a Slider object,
> things go to shit because the cast is invalid. this.Parent is of type
> Slider!SliderItem.

It's the same setup as with the A and B things, right?

Parent is a Widget that holds a Slider!SliderItem. That's fine because 
Slider!SliderItem is derived from Button!SliderItem which is derived 
from Widget.

But Button!SliderItem does not derive from Button!ButtonItem. They both 
derive from Widget. So the cast fails.

But you think it should succeed, of course.

Is your position that Button!SliderItem should derive/inherit from 
Button!ButtonItem, enabling the cast, or do you suppose the cast should 
succeed because the fields are compatible?

I.e., should this work?

     class A {int x;}
     class B {int x;}
     A a;
     B b = cast(B) a;

> SliderItem only sets the array type. So in Slider, I end up with a
> SliderItem[] type then in ButtonItem's Do(which gets called since
> SliderItem doesn't override), it tries to cast that down to a
> ButtonItem. It should work. There is no reason it shouldn't logically.
> There is no up casting.

Some terminology clarification: Casting from SliderItem to ButtonItem is 
upcasting. The other direction would be downcasting. Upcasting a single 
object is trivial and can be done implicitly. Downcasting must be done 
explicitly and may yield null.

You say that you cast from SliderItem to ButtonItem. But that's not 
what's done in your snippet above. You try to cast from 
Button!SliderItem to Button!ButtonItem. Completely different operation.



More information about the Digitalmars-d-learn mailing list