Запустить событие, не подписавшись на него - PullRequest
1 голос
/ 24 февраля 2012

В настоящее время я программирую библиотеку для простых игр, в основном предназначенную для использования мной.Теперь я столкнулся с проблемой.У меня есть класс под названием «Game», который выглядит следующим образом:

class Game
{

    private List<Entity> entities;
    private int counter;

    public Game()
    {
        entities = new List<Entity>();
        counter = 0;
    }

    public AddEntity(Entity entity_)
    {
        entities.Add(entity_);
        // problem! how to inform entity_ that it was added?

        counter++;
    }
}

Entity - это класс, из которого должен быть получен каждый объект, который действует в игре.Его содержание не имеет большого значения.То, что я ищу, - это способ, которым Game информирует вновь добавленный класс entity_ о своем владельце (текущем экземпляре Game) и его идентификаторе (для чего и используется «counter»).Теперь я думал об использовании интерфейса, у которого был бы метод «OnAdd (Game owner_, int id_)» для этого, поскольку это определенно сработало бы, но я хотел убедиться, что нет предпочтительного способа преодоления этого.Вот мой вопрос:

Есть ли лучшее решение для моей проблемы, чем интерфейсы?Экземпляр Entity не знает, к какому экземпляру Game он добавляется, и использование методов для целей, подобных событиям, мне не подходит.Я могу ошибаться, если конечно.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

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

... code ...
entities.Add(entity_);
entity_.AddToGame(this);
... code ...

, а затем в методе AddToGame вы будете делать все, что угоднобудет делать в вашем обработчике событий, который сейчас не нужен.

1 голос
/ 24 февраля 2012

Да, кажется правильным. Но нужно добавить разницу.

Интерфейс - После внесения изменений необходимо отслеживать все реализации.

Абстрактный класс - виртуальные функции могут быть объявлены, поэтому нет необходимости отслеживать реализации

0 голосов
/ 24 февраля 2012

Существует множество решений.

Конечно, вы можете вызвать метод после .Add:

entity_.HasBeenAdded();

Другим решением будет "отменить добавление".Что-то вроде:

Класс сущности:

public Entity
{

    ...

    public void AddTo(IList<Entity> list)
    {
        if (list == null)
        {
            throw new ArgumentNullException();
        }

        list.Add(this);

        // Do some logic here, as you now know your object
        // has been added.
    }
}

...

entity_.AddTo(entities);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...