Я занимаюсь шахматной игрой в единстве (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. Чтобы уточнить, я пытаюсь отправить информацию между двумя классами, которые наследуются от абстрактного. Может быть, есть более простой способ / совершенно другой способ, и я готов учиться: D
Очень хорошо. Вы поняли, почему то, что вы пробовали, не работает так, как вы ожидали? Сначала мы должны убрать это с дороги.
Если мои предположения не ошибочны, потому что каждый класс имеет копию базового класса вместо того, чтобы использовать его. У них будут свои собственные реестры событий, не связанные между собой, поэтому они не будут отправлять информацию друг другу.
@AdrianSgro более или менее, но я бы не стал называть это «копией» базового класса, просто чтобы избежать путаницы с композицией, где вы буквально сохраняете ссылку на класс внутри своего класса. Базовый класс больше похож на шаблон для «генерации» производных классов, поэтому каждый из них получает «копию» исходного кода базового класса, и создаются 2 независимых класса. Я думаю, что вы хотите переместить событие в класс игровой доски и подписаться на события, публикуемые этим игровым объектом.
Всем большое спасибо! Я только что сделал то, что рекомендовал @Colin Young, через экземпляр моей доски, и он отлично работает. Это мой первый пост о stackoverflow, и я получил решение за несколько минут. Ребята, молодцы!
@ColinYoung, вы должны опубликовать это как ответ для будущих зрителей.
@TJWolschon Готово. Я предполагаю, что подразумеваемый вопрос был «как мне организовать подписку каждого партнера на события друг друга?»





Наследование можно рассматривать как своего рода шаблон кода, который «вставляется» в источник дочернего класса, поэтому классы-потомки полностью независимы друг от друга. Предполагая, что ваши дочерние классы являются игровыми элементами, и вы хотите предупредить все части о событии, это не сработает, если ваш дочерний класс инициирует событие. То есть, если каждый дочерний объект не подписывается на это событие для каждого другого дочернего объекта (мы пока проигнорируем подписки на события n2), и в этом случае вам нужно будет отслеживать каждого дочернего объекта где-то в центре, и если ты собираешься сделать это ...
Лучше всего добавить событие к GameObject, представляющему вашу игровую доску (т.е.классу, который управляет элементами, правилами игры и т. д., Назовем его BoardManager). BoardManager отвечает за подписку на события для каждой пьесы и публикацию событий, представляющих интерес для каждой пьесы (теперь у нас всего 2n подписок на события). Этот подход не так уж и далек от Шаблон архитектуры потока.
(Я собираюсь использовать шахматные имена в этом примере - и, мальчик, я бы хотел, чтобы у SO была функция диаграммы последовательности)
Knight уведомляет BoardManager, что хочет перейти на x, yBoardManager проверяет действительность, говорит Knight перейти на x, yKnight сообщает BoardManager: "Я закончил двигаться"BoardManager замечает, что King подвергается атаке, и рассылает уведомление по каждой части этого факта.King находится под атакой ...
Я думаю, что есть недопонимание наследования. Экземпляры «Дочернего» класса не разделяют (нестатические) поля класса базового класса. У них есть своя «копия», если хотите. Чтобы упростить это, представьте, что это дочерние элементы, у которых событие объявлено напрямую через базовый класс. У двух экземпляров будут разные наборы реестров событий. Если вы хочу описанного поведения, то есть разные способы добиться этого. Так что, если мои предположения верны, это вопрос x-y.