Thread overview
Is it possible to store different subclasses in one array?
Apr 13, 2020
Leonardo
Apr 13, 2020
Adam D. Ruppe
Apr 13, 2020
Leonardo
Apr 13, 2020
Leonardo
Apr 13, 2020
evilrat
Apr 13, 2020
Leonardo
Apr 14, 2020
Manfred Nowak
April 13, 2020
Is it possible to store different subclasses in one array?
In C#, we have this example, but how I do that in D?


public class BaseItem{
      public string name = "";
 }

 public class Weapon : BaseItem{
      public int damage = 10;
 }

 public class Potion : BaseItem{
      public int hpRestore = 50;
 }

var GameItems = new List<BaseItem>();
GameItems.Add(new Weapon());
GameItems.Add(new Potion());



April 13, 2020
On Monday, 13 April 2020 at 01:42:51 UTC, Leonardo wrote:
> Is it possible to store different subclasses in one array?
> In C#, we have this example, but how I do that in D?

Did you try

BaseItem[] GameItems;
GameItems ~= new Weapon();


yet?
April 13, 2020
On Monday, 13 April 2020 at 01:47:11 UTC, Adam D. Ruppe wrote:
> On Monday, 13 April 2020 at 01:42:51 UTC, Leonardo wrote:
>> Is it possible to store different subclasses in one array?
>> In C#, we have this example, but how I do that in D?
>
> Did you try
>
> BaseItem[] GameItems;
> GameItems ~= new Weapon();
>
>
> yet?

Oh, thanks, this works. Now it seems obvious.
But fitting another question, this case is only representative, if I want to use one method present in only one of these classes like this:

 foreach (ref gi; GameItems)
{
    if (gi == Weapon)
        gi.Attack()
}

How would it be?
April 13, 2020
On Monday, 13 April 2020 at 04:15:04 UTC, Leonardo wrote:
> On Monday, 13 April 2020 at 01:47:11 UTC, Adam D. Ruppe wrote:
>> On Monday, 13 April 2020 at 01:42:51 UTC, Leonardo wrote:
>>> Is it possible to store different subclasses in one array?
>>> In C#, we have this example, but how I do that in D?
>>
>> Did you try
>>
>> BaseItem[] GameItems;
>> GameItems ~= new Weapon();
>>
>>
>> yet?
>
> Oh, thanks, this works. Now it seems obvious.
> But fitting another question, this case is only representative, if I want to use one method present in only one of these classes like this:
>
>  foreach (ref gi; GameItems)
> {
>     if (gi == Weapon)
>         gi.Attack()
> }
>
> How would it be?

Replying myself...

weapon = cast(Weapon) gi;
if (weapon !is null)
    weapon.Attack()
April 13, 2020
On Monday, 13 April 2020 at 04:21:48 UTC, Leonardo wrote:
>>
>>  foreach (ref gi; GameItems)
>> {
>>     if (gi == Weapon)
>>         gi.Attack()
>> }
>>
>> How would it be?
>
> Replying myself...
>
> weapon = cast(Weapon) gi;
> if (weapon !is null)
>     weapon.Attack()

can be simplified as:

    if (auto weapon = cast(Weapon) gi)
        weapon.Attack();
April 13, 2020
On Monday, 13 April 2020 at 05:54:52 UTC, evilrat wrote:
> On Monday, 13 April 2020 at 04:21:48 UTC, Leonardo wrote:
>>>
>>>  foreach (ref gi; GameItems)
>>> {
>>>     if (gi == Weapon)
>>>         gi.Attack()
>>> }
>>>
>>> How would it be?
>>
>> Replying myself...
>>
>> weapon = cast(Weapon) gi;
>> if (weapon !is null)
>>     weapon.Attack()
>
> can be simplified as:
>
>     if (auto weapon = cast(Weapon) gi)
>         weapon.Attack();

Even better. Thanks folks!
April 14, 2020
On Monday, 13 April 2020 at 05:54:52 UTC, evilrat wrote:
>     if (auto weapon = cast(Weapon) gi)
>         weapon.Attack();

Does the parlor (currently illegal in Dlang)

      if (Weapon w := gi)
          w.Attack();

look nicer or even (currently legal):

      if (Weapon w ._= gi)
          w.Attack();