Можно ли объекту подписываться на собственные события для изменения внутренних данных? - PullRequest
0 голосов
/ 05 сентября 2018

Как видно из заголовка, разумно ли для объекта подписываться на свои собственные события?

public class Player
{
    private int team;

    public Action<int> TeamChanged { get; set; }

    public Player(int startingTeam)
    {
        team = startingTeam;

        TeamChanged += OnTeamChanged; // subscribe to my own event
    }

    private void OnTeamChanged(int newTeam)
    {
        team = newTeam;
    }
}

// later during the match:
public void ShuffleTeam()
{
    player.TeamChanged(GetRandomTeam());
}

Это кажется намного более лаконичным, чем наличие дополнительной функции ChangeTeam (), которая вызывает само событие. Но по какой-то причине тоже чувствует себя не так.

1 Ответ

0 голосов
/ 05 сентября 2018

Вы, кажется, понимаете события с ног на голову. И событие запускается, когда что-то происходит, вы не запускаете событие, чтобы это произошло; Вы вызываете метод.

В вашем случае, когда свойство Team изменяется, вы запускаете событие. Вы не запускаете событие, чтобы заставить команду измениться. Вам нужно сменить команду? Реализуйте общедоступный метод или метод установки свойств, который делает именно это, и пусть тот, кто хочет сменить команду, изменится.

Кроме того, объявите событие как событие, а не делегат. Правильный способ решения вашей проблемы:

public class Player
{
    public event Action<int> TeamChanged;

    private int team;
    public int Team 
    {
        get { return team; }
        set 
        {
            if (value != team) {
                team = value;
                OnTeamChanged(team); } 
        } 
    }

    public Player(int startingTeam)
    {
        team = startingTeam; 
    }

    private void OnTeamChanged(int newTeam)
    {
        TeamChanged?.Invoke(team);
    }
}

И теперь любой потребитель, которому нужно действовать в соответствии с командой смены игрока, подписался бы на это событие.

Вы также можете пропустить весь бизнес OnTeamChanged и вызвать событие непосредственно в установщике свойств, если только вы не думаете о какой-либо модели наследования, и в этом случае метод должен быть protected.

Короче говоря, подписка на собственное событие вообще не имеет смысла. Проект, управляемый событиями, полезен именно потому, что вы не можете контролировать или знать , когда событие сработает; пользователь нажимает кнопку мыши или закрывает приложение. С событием, объявленным в самом классе, вы всегда знаете, когда оно будет вызвано, вам пришлось где-то реализовать вызов, подписка на него бессмысленна.

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