我觉得我应该只有一个实例变量引用一个对象。但是在下面的代码中,我有2个实例变量" _character"和" _witch"引用同一个对象。如果我添加一个更专业的巫婆类,我必须添加第三个实例变量 这通常是人们在这种情况下做的事情吗?或者有没有办法只使用一个参考来实现这一目标?另外,我真的不想要投出任何东西(除非这确实是这种情况下的最佳实践)。
在扩展AnimationController的WitchAnimationController之上,WitchState扩展了CharacterState。
基类:
public class AnimationController
{
protected CharacterState _character;
public AnimationController( CharacterState character )
{
_character = character;
}
public void UpdateAnimations()
{
/* call on some CharacterState functions... */
}
}
儿童班:
public class WitchAnimationController : AnimationController
{
protected WitchState _witch; //inherits from CharacterState
public AnimationController( WitchState witch ) : base( witch )
{
_witch = witch;
}
public void UpdateAnimations()
{
base.UpdateAnimations();
/* call on some WitchState functions... */
}
}
答案 0 :(得分:8)
如果您不需要特定于女巫的电话,您可以放弃_witch
字段并使用_character
字段 - 尽管我个人将其作为私人字段受保护的财产。
如果您需要特定于角色的成员,则应考虑使动画控制器具有通用性:
public class AnimationController<T> where T : CharacterState
{
protected T _character;
public AnimationController(T character)
{
_character = character;
}
public void UpdateAnimations()
{
/* call on some CharacterState functions... */
}
}
然后:
public class WitchAnimationController : AnimationController<WitchState>
{
public WitchAnimationController(WitchState witch) : base(witch)
{}
public void UpdateAnimations()
{
base.UpdateAnimations();
_character.SomeMethodOnWitchState();
}
}
_character.SomeMethodOnWitchState()
来电将在WitchAnimationController
内有效,因为_character
实际上属于WitchState
类型。
答案 1 :(得分:2)
你所拥有的并不可怕,但请考虑这个设计:
public class AnimationController
{
public AnimationController( )
{
}
public void UpdateAnimations( CharacterState character )
{
/* call on some CharacterState functions... */
}
}
public class WitchAnimationController : AnimationController
{
public AnimationController( )
{
}
public void UpdateAnimations(WitchState witch )
{
base.UpdateAnimations(witch );
/* call on some WitchState functions... */
}
}
可以保留所有引用,但如果控制器实际上只是调用函数,则可以让其他人维护不同的状态对象。
任何一种方法都同样有效,没有更多信息(就像AnimationController
的其他重要成员一样,我会采用我的方法。
答案 2 :(得分:2)
使用generics:
public class AnimationController<T> where T : CharacterState
{
protected T _character;
public AnimationController(CharacterState character)
{
_character = character;
}
}
然后在每个祖先_character
将是相应的继承类型,如下所示:
public class WitchAnimationController : AnimationController<WitchState>
{
public AnimationController(WitchState witch) : base(witch)
{
}
}