如何在没有引用同一对象的多个实例变量的情况下实现继承?

时间:2014-09-05 20:44:38

标签: c# inheritance casting

我觉得我应该只有一个实例变量引用一个对象。但是在下面的代码中,我有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... */
    }
}

3 个答案:

答案 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) 
    {
    }
}