C# слушатель события в дочернем классе

Я занимаюсь шахматной игрой в единстве (C#), и я застреваю, пытаясь выполнить повышающее преобразование, чтобы отправить информацию от одного ребенка другому из абстрактного класса.

По сути, у меня есть абстрактный класс, у которого есть событие / делегат с функцией, поэтому к нему может получить доступ дочерний класс, например:

public delegate void KingUnderAttack(int CurrentX, int CurrentY, int CurrentAttackerX, int CurrentAttackery, System.Type attacker, bool isKingWhite);
public event KingUnderAttack kingUnderAttack;

protected void RaiseKingUnderAttack(int CurrentX, int CurrentY, int CurrentAttackerX, int CurrentAttackerY, System.Type attacker, bool isKingWhite)
{
    if (kingUnderAttack != null)
    {
        kingUnderAttack(CurrentX, CurrentY, CurrentAttackerX, CurrentAttackerY, attacker, isKingWhite);
    }
}

и в моем дочернем классе я получаю к нему доступ следующим образом:

RaiseKingUnderAttack(CurrentX, CurrentY, x, y, typeof(Knight), isWhite);

и о получающем дочернем классе:

private void Start()
{
    kingUnderAttack += Knight_kingUnderAttack;
}

private void Knight_kingUnderAttack(int CurrentX, int CurrentY, int CurrentAttackerX, int CurrentAttackerY, System.Type attacker, bool isKingWhite)
{
    Debug.Log(CurrentX);
    Debug.Log(CurrentY);
    Debug.Log(CurrentAttackerX);
    Debug.Log(CurrentAttackerY);
    Debug.Log(attacker);
    Debug.Log(isKingWhite);
}

путем отладки я мог видеть, что абстрактный класс получает дочернюю информацию, но информация не достигает второго дочернего класса. Я действительно застрял, пытаясь понять почему.

Я думаю, что есть недопонимание наследования. Экземпляры «Дочернего» класса не разделяют (нестатические) поля класса базового класса. У них есть своя «копия», если хотите. Чтобы упростить это, представьте, что это дочерние элементы, у которых событие объявлено напрямую через базовый класс. У двух экземпляров будут разные наборы реестров событий. Если вы хочу описанного поведения, то есть разные способы добиться этого. Так что, если мои предположения верны, это вопрос x-y.

Fildor 04.04.2018 13:20

Пожалуйста, опубликуйте минимальные определения классов. Эти разговоры о «втором дочернем классе» и «получении дочернего класса» сбивают с толку. Однако я подозреваю, что проблема в том ... что Филдор только что опередил меня в публикации :)

Stephen Kennedy 04.04.2018 13:21

Как я уже сказал, я новичок в этом. Так что это действительно может быть вопрос x-y. Чтобы уточнить, я пытаюсь отправить информацию между двумя классами, которые наследуются от абстрактного. Может быть, есть более простой способ / совершенно другой способ, и я готов учиться: D

user9596240 04.04.2018 13:28

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

Fildor 04.04.2018 13:34

Если мои предположения не ошибочны, потому что каждый класс имеет копию базового класса вместо того, чтобы использовать его. У них будут свои собственные реестры событий, не связанные между собой, поэтому они не будут отправлять информацию друг другу.

user9596240 04.04.2018 13:40

@AdrianSgro более или менее, но я бы не стал называть это «копией» базового класса, просто чтобы избежать путаницы с композицией, где вы буквально сохраняете ссылку на класс внутри своего класса. Базовый класс больше похож на шаблон для «генерации» производных классов, поэтому каждый из них получает «копию» исходного кода базового класса, и создаются 2 независимых класса. Я думаю, что вы хотите переместить событие в класс игровой доски и подписаться на события, публикуемые этим игровым объектом.

Colin Young 04.04.2018 13:48

Всем большое спасибо! Я только что сделал то, что рекомендовал @Colin Young, через экземпляр моей доски, и он отлично работает. Это мой первый пост о stackoverflow, и я получил решение за несколько минут. Ребята, молодцы!

user9596240 04.04.2018 14:04

@ColinYoung, вы должны опубликовать это как ответ для будущих зрителей.

TJ Wolschon 04.04.2018 14:24

@TJWolschon Готово. Я предполагаю, что подразумеваемый вопрос был «как мне организовать подписку каждого партнера на события друг друга?»

Colin Young 04.04.2018 17:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
245
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наследование можно рассматривать как своего рода шаблон кода, который «вставляется» в источник дочернего класса, поэтому классы-потомки полностью независимы друг от друга. Предполагая, что ваши дочерние классы являются игровыми элементами, и вы хотите предупредить все части о событии, это не сработает, если ваш дочерний класс инициирует событие. То есть, если каждый дочерний объект не подписывается на это событие для каждого другого дочернего объекта (мы пока проигнорируем подписки на события n2), и в этом случае вам нужно будет отслеживать каждого дочернего объекта где-то в центре, и если ты собираешься сделать это ...

Лучше всего добавить событие к GameObject, представляющему вашу игровую доску (т.е.классу, который управляет элементами, правилами игры и т. д., Назовем его BoardManager). BoardManager отвечает за подписку на события для каждой пьесы и публикацию событий, представляющих интерес для каждой пьесы (теперь у нас всего 2n подписок на события). Этот подход не так уж и далек от Шаблон архитектуры потока.

(Я собираюсь использовать шахматные имена в этом примере - и, мальчик, я бы хотел, чтобы у SO была функция диаграммы последовательности)

  1. Knight уведомляет BoardManager, что хочет перейти на x, y
  2. BoardManager проверяет действительность, говорит Knight перейти на x, y
  3. Knight сообщает BoardManager: "Я закончил двигаться"
  4. BoardManager замечает, что King подвергается атаке, и рассылает уведомление по каждой части этого факта.
  5. Каждая деталь индивидуально делает то, что должна делать, когда King находится под атакой ...

Другие вопросы по теме