亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將多態對象作為派生對象傳遞?

如何將多態對象作為派生對象傳遞?

C#
哈士奇WWW 2022-01-09 10:30:03
為了簡單起見,我有兩個類:ActionTaken和MovementTaken. MovementTaken是一個派生類ActionTaken。我有一個Queue完整的動作,每個動作都有一個char決定動作類型的。(每個動作都有一個正確的類型)我想將 的元素傳遞Queue給一個函數,該函數專門與一個MovementTaken參數一起工作,但是由于我使用多態性,所以參數是 type ActionTaken,但是我不能使用來自 的成員變量MovementTaken,但是不要不存在于ActionTaken. 但是如果我將 functionactivateMovement的參數設置為 type MovementTaken,我相信會有一個錯誤,說你不能將基類型轉換為派生類型。這是代碼:public abstract class ActionTaken : MonoBehaviour{    public char type;    public Transform minionTakingAction;}public class MovementTaken : ActionTaken{    public int targetTileH;    public int targetTileV;    public MovementTaken(Transform _minionTakingAction, int _targetTileH, int _targetTileV)    {        type = 'M';        minionTakingAction = _minionTakingAction;        targetTileH = _targetTileH;        targetTileV = _targetTileV;    }}Queue<ActionTaken> actionTaken;public void activateMovement(ActionTaken toActivate){//some code using toActivate's members targetTileH and targetTileV}
查看完整描述

2 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

如果您知道傳遞給該方法的參數是一個MovementTaken實例,則可以將其向下轉換:


public void activateMovement(ActionTaken toActivate)

{

    MovementTaken casted = toActivate as MovementTaken;

    // Do something with casted.targetTileH and/or caster.targetTileV


查看完整回答
反對 回復 2022-01-09
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

Abstract類的優點是定義基本實現,或強制派生類型進入實現細節:


public abstract class ActionTaken : MonoBehaviour

{

    public char Type { get; protected set; }

    public Transform Target { get; }


    // base ctor

    protected ActionTaken(Transform target)

    {

        Type = '\0'; 

        Target = target;

    }


    // Force implementation onto sub class

    public abstract void Activate();

}


public class MovementTaken : ActionTaken

{

    public int TileH { get; set; }

    public int TileV { get; set; }


    public MovementTaken(Transform target, int tileH, int tileV)

        : base(target)

    {

        Type = 'M';

        TileH = tileH;

        TileV = tileV;

    }


    public override void Activate()

    {

        //some code using TileH and TileV

    }

}

因此,您的調用代碼將是:


Queue<ActionTaken> actionTaken;

public void activateMovement(ActionTaken action)

{

    action.Activate();

}

我也不確定Type它的用途,但如果你仍然需要它,最好在每個類中定義一個常量,ActionTaken如果你有更多的話。


如果你最終Queue<ActionTaken>用各種派生的運動類型填充你的,這可能是有意義的。否則,您的ActivateMovement方法可能最終會成為一個冗長的switch聲明。


接口在這里也可能是有利的:


public interface IActionTaken

{

    Transform Target { get; }


    void Activate();

}

然后您將替換您的隊列: Queue<IActionTaken> Actions


調用隊列中所有動作的代碼可以非常簡單:


while(Actions.Count > 0)

{

    IActionTaken current = Actions.Dequeue();

    current.Activate();

}


查看完整回答
反對 回復 2022-01-09
  • 2 回答
  • 0 關注
  • 152 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號