Преимущество 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();
}