How to use base class & child class as parameter in one function ?

Steven Schveighoffer schveiguy at gmail.com
Fri May 22 20:51:20 UTC 2020


On 5/22/20 4:04 PM, Vinod K Chandran wrote:
> On Friday, 22 May 2020 at 16:12:12 UTC, Steven Schveighoffer wrote:
>> On 5/22/20 9:10 AM, Vinod K Chandran wrote:
>>> On Friday, 22 May 2020 at 12:21:25 UTC, rikki cattermole wrote:
>>>> if (Child child = cast(Child)parent) {
>>>>     assert(child !is null);
>>>> }
>>>
>>> Actually, problem occurs in addHandler function. It expects an 
>>> argument of type "EventArgs", not MouseEventArgs.
>>
>> Yes, because what if you did this with your function:
>>
>> fnp(new EventArgs(...));
>>
>> It would be called with the type being implicitly cast to the child 
>> type without that being true.
>>
>> What Rikki was recommending is that you write your handler like this:
>>
>> void onClick(EventArgs e){
>>     if(auto me = cast(MouseEventArgs)e) {
>>     log("form clicked on x = ", me.x, ", and y = ", me.y);
>>     }
>> }
>>
>> Actually, if you are certain it's a programming error for onClick to 
>> be called with a different type of event args, I'd do:
>>
>> void onClick(EventArgs e){
>>     auto me = cast(MouseEventArgs)e;
>>     assert(me !is null, "Error, onClick called with invalid event type");
>>     log("form clicked on x = ", me.x, ", and y = ", me.y);
>> }
> 
> Thanks for the answer. I understand that, in D, derived class and base 
> class are not the same as in vb.net or any other language. (Please 
> correct me if i am wrong).
> In vb.net, assume that i have a class setup like this--
> Public Class Base
>      Public Property SampleInt As Integer
> End Class
> 
> Public Class Child : Inherits Base
>      Public Property SampleDouble As Double
> End Class
> //Assume that i have a list of Base class like this--
> Dim sampleList As New List(Of Base)
> // Now, i can use this list like this--
> sampleList.Add(New Child(10.5)) Is this possible in D without casting ?
> 

Yes. What you cannot do is this (which I hope doesn't compile in VB.net, 
but I wouldn't be surprised):

Dim sampleList As New List(Of Child)
sampleList.Add(New Base(10))

Which is the equivalent of what you were requesting.

-Steve


More information about the Digitalmars-d-learn mailing list