Поднять событие среди всех экземпляров класса - PullRequest
3 голосов
/ 03 августа 2010

У меня есть абсолютный класс с именем Организм , который имеет событие Рожденный . Также у меня есть несколько классов, которые наследуют класс Организм ... Поэтому мой вопрос заключается в том, как я могу вызвать событие Рожденный среди всех экземпляров всех классов, которые унаследовали Организм класс?

РЕДАКТИРОВАТЬ: Извините, событие, которое я намеревался написать, было Tick not Born ... Born - событие уровня экземпляра ...

Ответы [ 4 ]

2 голосов
/ 03 августа 2010
public class Organism : IDisposable
{
    public static List<Organism> All = new List<Organism>();

    private bool disposed = false;

    public Organism()
    {
        Organism.All.Add(this);
    }

    public void BeBorn()
    {
        throw new NotImplementedException();
    }

    public void Dispose()
    {
        Dispose(true);

        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                Organism.All.Remove(this);
            }

            disposed = true;
        }
    }

    ~Organism()
    {
        Dispose(false);
    }

}
0 голосов
/ 03 августа 2010

Почему бы каждому конкретному организму не вызывать событие рождения своего родителя, когда он родился. Что-то вроде:

public abstract class Organism
{
    public event EventHandler<EventArgs> Born;
    public string Name { get; set; }

    public Organism()
    {
    }

    public void Birth()
    {
        this.raiseBorn(new EventArgs());
    }

    protected void raiseBorn(EventArgs args)
    {
        EventHandler<EventArgs> handler = this.Born;
        if (handler != null)
            handler(this, args);
    }
}

// Concrete organisms ========--------

public class Dog : Organism
{
    public Dog()
    {
        this.Name = "Dog";
    }

    public override string ToString()
    {
        return this.Name;
    }
}

public class Cat : Organism
{
    public Cat() 
    {
        this.Name = "Cat";
    }

    public override string ToString()
    {
        return this.Name;
    }
}

// Creature Factory ========--------

public class CreatureCreator : List<Organism>
{
    public event EventHandler<BornArgs> CreaturBorn;
    private void raiseCreatureBorn(BornArgs args)
    {
        EventHandler<BornArgs> handler = this.CreaturBorn;
        if (handler != null)
            handler(this.CreaturBorn, args);
    }

    public void CreateCreature<T>() where T : Organism, new()
    {
        Organism o = new T();
        o.Born += o_Born;
        this.Add(o);

        o.Birth();
    }

    private void o_Born(object sender, EventArgs e)
    {
        this.raiseCreatureBorn(new BornArgs((Organism)sender));
    }
}

public class BornArgs : EventArgs
{
    public Organism Creature { get; set; }

    public BornArgs(Organism o)
    {
        this.Creature = o;
    }
}

// Usage ========--------

static void Main(string[] args)
{
    CreatureCreator deity = new CreatureCreator();
    deity.CreaturBorn += deity_CreaturBorn;

    deity.CreateCreature<Dog>();
    deity.CreateCreature<Cat>();

    Console.ReadKey();
}

static void deity_CreaturBorn(object sender, BornArgs e)
{
    Console.WriteLine(e.Creature.ToString() + " was born");
}

вывод:

Dog was born
Cat was born
0 голосов
/ 03 августа 2010

Это не здорово, но это может сработать:

public abstract class Organism : IDisposable
{
    private static readonly List<Organism> LiveOrganisms = 
        new List<Organism>();

    private event EventHandler onBorn;

    public void InvokeBorn(EventArgs e)
    {

        foreach (var liveOrganism in LiveOrganisms
            .Where(liveOrganism => liveOrganism.onBorn != null))
        {
            liveOrganism.onBorn(this, e);
        }
    }

    public event EventHandler Born
{
    add
    {
        onBorn += value;
    }
    remove
    {
        onBorn -= value;
    }
}

    protected Organism()
    {
        LiveOrganisms.Add(this);
    }

    public void Dispose()
    {
        LiveOrganisms.Remove(this);
    }
}
0 голосов
/ 03 августа 2010

Невозможно получить список всех экземпляров какого-либо класса, поэтому вы должны самостоятельно отслеживать новые экземпляры:

List<Organism> organisms = new List<Organism>();

Organism bob = new Amoeba();
organisms.Add(bob);

Позже вы можете перебрать свой список экземпляров и заставить их всех вызывать событие, одно за другим:

foreach (Organism organism in organisms)
{
    organism.Awake();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...