我在团结中做了一个类似国际象棋的游戏(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);
}
通过调试我可以看到抽象类接收子信息但信息没有到达第二个子类。我真的很难想到为什么。
答案 0 :(得分:3)
继承可以被认为是一种“插入”子类源的代码模板,因此后代类完全相互独立。假设您的孩子课程是游戏片段,并且您想要提醒所有片段参加活动,如果您的孩子班级正在举办活动,那么它将无法运作。也就是说,除非每个子对象都在每个其他子对象上订阅该事件(我们现在将忽略n 2 事件订阅),在这种情况下,您将需要跟踪每个孩子都在某个中心位置,如果你打算这样做......
更好的方法是将事件添加到代表您的游戏板的GameObject
(即编排棋子,游戏规则等的类,让我们称之为BoardManager
)。 BoardManager
负责订阅每件作品上的活动并发布每件作品感兴趣的事件(现在我们只有2n个活动订阅)。这种方法与Flux architecture pattern没有那么远。
(我将在这个例子中使用国际象棋名称 - 男孩我希望SO有序列图功能)
Knight
通知BoardManager
它想要转移到x, y
BoardManager
检查有效性,告知Knight
移至x, y
Knight
告诉BoardManager
“我已经完成了移动”BoardManager
发现King
受到攻击,并向该事实的每一部分发出通知King
受到攻击时,每件作品都会做他们应该做的事情......