第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何將多態(tài)對(duì)象作為派生對(duì)象傳遞?

如何將多態(tài)對(duì)象作為派生對(duì)象傳遞?

C#
哈士奇WWW 2022-01-09 10:30:03
為了簡單起見,我有兩個(gè)類:ActionTaken和MovementTaken. MovementTaken是一個(gè)派生類ActionTaken。我有一個(gè)Queue完整的動(dòng)作,每個(gè)動(dòng)作都有一個(gè)char決定動(dòng)作類型的。(每個(gè)動(dòng)作都有一個(gè)正確的類型)我想將 的元素傳遞Queue給一個(gè)函數(shù),該函數(shù)專門與一個(gè)MovementTaken參數(shù)一起工作,但是由于我使用多態(tài)性,所以參數(shù)是 type ActionTaken,但是我不能使用來自 的成員變量MovementTaken,但是不要不存在于ActionTaken. 但是如果我將 functionactivateMovement的參數(shù)設(shè)置為 type MovementTaken,我相信會(huì)有一個(gè)錯(cuò)誤,說你不能將基類型轉(zhuǎn)換為派生類型。這是代碼: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貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊

如果您知道傳遞給該方法的參數(shù)是一個(gè)MovementTaken實(shí)例,則可以將其向下轉(zhuǎn)換:


public void activateMovement(ActionTaken toActivate)

{

    MovementTaken casted = toActivate as MovementTaken;

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


查看完整回答
反對(duì) 回復(fù) 2022-01-09
?
FFIVE

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

Abstract類的優(yōu)點(diǎn)是定義基本實(shí)現(xiàn),或強(qiáng)制派生類型進(jìn)入實(shí)現(xiàn)細(xì)節(jié):


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

    }

}

因此,您的調(diào)用代碼將是:


Queue<ActionTaken> actionTaken;

public void activateMovement(ActionTaken action)

{

    action.Activate();

}

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


如果你最終Queue<ActionTaken>用各種派生的運(yùn)動(dòng)類型填充你的,這可能是有意義的。否則,您的ActivateMovement方法可能最終會(huì)成為一個(gè)冗長的switch聲明。


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


public interface IActionTaken

{

    Transform Target { get; }


    void Activate();

}

然后您將替換您的隊(duì)列: Queue<IActionTaken> Actions


調(diào)用隊(duì)列中所有動(dòng)作的代碼可以非常簡單:


while(Actions.Count > 0)

{

    IActionTaken current = Actions.Dequeue();

    current.Activate();

}


查看完整回答
反對(duì) 回復(fù) 2022-01-09
  • 2 回答
  • 0 關(guān)注
  • 145 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)