2 回答

TA貢獻1873條經驗 獲得超9個贊
如果您知道傳遞給該方法的參數是一個MovementTaken實例,則可以將其向下轉換:
public void activateMovement(ActionTaken toActivate)
{
MovementTaken casted = toActivate as MovementTaken;
// Do something with casted.targetTileH and/or caster.targetTileV

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();
}
- 2 回答
- 0 關注
- 152 瀏覽
添加回答
舉報