Cannot implicitly convert derived type
Frustrated
c1514843 at drdrb.com
Sun Feb 23 05:26:10 PST 2014
On Sunday, 23 February 2014 at 01:37:08 UTC, Steven Schveighoffer
wrote:
> On Sat, 22 Feb 2014 15:17:37 -0500, Frustrated
> <c1514843 at drdrb.com> wrote:
>
>> It is legal exactly because I will always guarantee that the
>> proper button will be used.
>
> Static typing says it's not legal. D does not do dynamic type
> checking upon calling virtual functions.
>
>> It is not logically legal as mentioned several times... no one
>> needs to mention that. But it is legal within the context of
>> the
>> code. I'll never use a RogueButton so why force me to code for
>> the chance I might?
>
> You may not be the only one using WindowsGui. You can't
> guarantee other code won't do it. In any case, the compiler
> cannot possibly know your intentions.
>
>> Basically, the point is, the compiler could enforce the above
>> but
>> make the code more readable.
>>
>> e.g.,
>>
>> I do this:
>>
>> @property WindowsButton button(WindowsButton b)
>> {
>>
>> }
>>
>> The compiler turns this into
>>
>> @property WindowsButton button(iButton _b)
>> {
>> if (is(_b : WindowsButton)) assert(0, "Rogue button used");
>> auto b = cast(WindowsButton)_b;
>>
>> }
>
> This solution is not as efficient as the one I outlined. If you
> have a WindowsGui object, no need to accept iButton when you
> require WindowsButton.
>
>> One allows me to program in a natural way while the other makes
>> me jump through hoops which litters the code with a bunch of
>> casts and checks which are only there in the odd event that I
>> assign the wrong type(which, I'm not going to do on purpose).
>
> Sorry, if you want a dynamically typed language, use one. D is
> not that.
>
>> Again, the whole point of why it is illegal because you can
>> pass
>> a RogueButton... BUT I DON'T INTEND TO PASS THEM! If I could
>> absolutely guarantee that I won't pass them then there should
>> be
>> no problem(no asserts). Since I can't guarantee it I have to
>> litter my code with checks? The compiler could do this for me.
>
> You can't guarantee it. That is the point. The compiler could
> do the checks for you, but D is not dynamically typed. The best
> you can do is encapsulate the type checking code as a mixin.
>
> -Steve
It has nothing to do with being dynamically typed. We can't solve
this problem until you get your head out of the gutter(the gutter
being how D does things already. Can't make progress on something
if you ever look beyond what it can do).
This has to do with simply adding checks to enforce the type. I
can guarantee it, but like you said, I can't guarantee what
others do. Hence the check.
The fact is, I presented two versions of the code. One represents
the other. It is a representational problem, nothing more,
nothing less. Please understand that from now on.
e.g., a switch statement is just a representational form of if
statements to simplify. I'll I'm talking about is adding a switch
statement. (if you take that literal and can't see how it relates
to the original problem then you are completely missing the point
of the whole discussion)
I did think it might be possible to use CT reflection to generate
all the type checking automatically but this might be difficult
and would have to generate a new class. It seems like the only
way to get at this problem in D.
More information about the Digitalmars-d-learn
mailing list