Why does event remain null even after subscribing to it?

Viewed 38

I have classes Room and Iceball. Iceball and IceShard are inherited from class Magic. When I add new magic to room, room subscribes to event CreateNewMagic magic, but after exiting from method event is still null.

Iceball after collision should creates ice shards in the room with the help of event, but because the event is null room cant spawn ice shards

Class Room

{
    public readonly List<Magi> MagicInRoom;
    public void SpawnMagic(Magic magic)
        {
            MagicInRoom.Add(magic);
            magic.CreateNewMagic += SpawnMagic;
        }
}

Class Magic, IceBall and IceShard

public abstract class Magic
{
    public delegate void MagicHandler(Magic magic);
    public event MagicHandler CreateNewMagic;

    public virtual void OnCollisionEnter()
        {
            if (...)
                {
                ...
                }
        }
}

public class IceBall : Magic
{
    public delegate void MagicHandler(Magic magic);
    public event MagicHandler CreateNewMagic;

    public override void OnCollisionEnter()
        {
            if (...)
            {
                var iceShards = CreateIceShards();
                foreach (var iceShard in iceShards) 
                    if (CreateNewMagic != null) //ALWAYS IS NULL
                        CreateNewMagic(iceShard);
            }
        }
}

public class IceShard : Magic
{
 ...
}
1 Answers

Event should be abstract

public abstract class Magic
{
    public delegate void MagicHandler(Magic magic);
    public abstract event MagicHandler CreateNewMagic;

    public virtual void OnCollisionEnter()
        {
            if (...)
                {
                ...
                }
        }
}

public class IceBall : Magic
{
    public override event MagicHandler CreateNewMagic;

    public override void OnCollisionEnter()
        {
            if (...)
            {
                var iceShards = CreateIceShards();
                foreach (var iceShard in iceShards) 
                    if (CreateNewMagic != null) //ALWAYS IS NULL
                        CreateNewMagic(iceShard);
            }
        }
}

public class IceShard : Magic
{
    public override event MagicHandler CreateNewMagic;
}
Related