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