www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Is it possible to store different subclasses in one array?

reply Leonardo <leotada523 gmail.com> writes:
Is it possible to store different subclasses in one array?



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());
Apr 12 2020
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Monday, 13 April 2020 at 01:42:51 UTC, Leonardo wrote:
 Is it possible to store different subclasses in one array?

Did you try BaseItem[] GameItems; GameItems ~= new Weapon(); yet?
Apr 12 2020
parent reply Leonardo <leotada523 gmail.com> writes:
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?

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?
Apr 12 2020
parent reply Leonardo <leotada523 gmail.com> writes:
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?

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()
Apr 12 2020
parent reply evilrat <evilrat666 gmail.com> writes:
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();
Apr 12 2020
next sibling parent Leonardo <leotada523 gmail.com> writes:
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!
Apr 13 2020
prev sibling parent Manfred Nowak <svv1999 hotmail.com> writes:
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();
Apr 14 2020