我想我会在我的代码中使用一些案例研究作为我的意思的一个例子.
现在,我正在为基于组件的游戏系统开发一个行为/动作系统.GameObjects可以附加一个IBehaviorComponent和一个IActionComponent,只显示相关细节,公开以下内容:
public interface IBehaviorComponent : IBaseComponent
{
IBehavior Behavior { get; }
}
public interface IActionComponent : IBaseComponent
{
IAction Action { get; }
void ExecuteAction(IGameObject target = null);
}
Run Code Online (Sandbox Code Playgroud)
现在,到目前为止这一切都很好(至少对我而言!).但是,当我查看IActionComponent的实现时,麻烦开始酿造.
例如,一个简单的IActionComponent实现:
public class SimpleActionComponent : IActionComponent
{
public IAction Action { get; protected set; }
public void ExecuteAction(IGameObject target = null)
{
Action.Execute(target);
}
public void Update(float deltaTime) { } //from IBaseComponent
}
Run Code Online (Sandbox Code Playgroud)
但是,假设我想引入一个更复杂的IActionComponent实现,它允许在定时计划上执行操作:
public class TimedActionComponent : IActionComponent
{
public IAction Action { get; protected set; } …Run Code Online (Sandbox Code Playgroud) 假设我有以下类层次结构(包括基本接口):
IAction -> (abstract) BaseAction -> (concrete) ImmediateAction -> (concrete) MovementAction
Run Code Online (Sandbox Code Playgroud)
现在,让我们说IAction公开了一个方法(嗯,实际上是IAction实现的不同接口,但让我们在这里保持简单!):
// Returns a new IAction instance deep copied from the current instance.
IAction DeepClone();
Run Code Online (Sandbox Code Playgroud)
目前很好?我们有深度复制方法,并且ImmediateAction有一些它想要复制的属性,因此它不仅提供实现DeepClone(),还提供复制构造函数:
//Base Action implementation
protected BaseAction(BaseAction old)
{
this.something = old.something;
}
//Immediate Action Implementation
protected ImmediateAction(ImmediateAction old)
: base(old)
{
this.anything = old.anything;
}
public IAction DeepClone()
{
return new ImmediateAction(this);
}
Run Code Online (Sandbox Code Playgroud)
现在,假设其中MovementAction没有任何与a相关的内容DeepClone(),因此它不实现方法或复制构造函数.
我遇到的问题是:
IAction x = new MovementAction();
IAction y = x.DeepClone();
//pleaseBeTrue is …Run Code Online (Sandbox Code Playgroud)