子类

时间:2018-04-04 11:15:15

标签: c# unity3d

我在团结中做了一个类似国际象棋的游戏(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);
}

通过调试我可以看到抽象类接收子信息但信息没有到达第二个子类。我真的很难想到为什么。

1 个答案:

答案 0 :(得分:3)

继承可以被认为是一种“插入”子类源的代码模板,因此后代类完全相互独立。假设您的孩子课程是游戏片段,并且您想要提醒所有片段参加活动,如果您的孩子班级正在举办活动,那么它将无法运作。也就是说,除非每个子对象都在每个其他子对象上订阅该事件(我们现在将忽略n 2 事件订阅),在这种情况下,您将需要跟踪每个孩子都在某个中心位置,如果你打算这样做......

更好的方法是将事件添加到代表您的游戏板的GameObject(即编排棋子,游戏规则等的类,让我们称之为BoardManager)。 BoardManager负责订阅每件作品上的活动并发布每件作品感兴趣的事件(现在我们只有2n个活动订阅)。这种方法与Flux architecture pattern没有那么远。

(我将在这个例子中使用国际象棋名称 - 男孩我希望SO有序列图功能)

  1. Knight通知BoardManager它想要转移到x, y
  2. BoardManager检查有效性,告知Knight移至x, y
  3. Knight告诉BoardManager“我已经完成了移动”
  4. BoardManager发现King受到攻击,并向该事实的每一部分发出通知
  5. King受到攻击时,每件作品都会做他们应该做的事情......