【问题标题】:Implementing an abstract Enum property in a child class在子类中实现抽象枚举属性
【发布时间】:2018-10-21 03:29:57
【问题描述】:

我有以下基类

public abstract class Character : MonoBehaviour
{
    protected abstract Enum CurrentState
    {
        get;
        set;
    }
}

和下面的子类

public class Player : Character
{
    protected override Enum CurrentState
    {
        get
        {
            return (State)_anim.GetInteger("State");
        }
        set
        {
           _anim.SetInteger("State", Convert.ToInt32(value));
        }
    }

    private enum State
    {
        IDLE = 0,
        WALK = 1,
        JUMP = 2,
        FALL = 3,
        CLIMB = 4,
        LOOKING_DOWN = 5,
        NPC = 6,
        IMPATIENT = 7,
        LOOKING_UP = 8,
        STUCK = 9,
    }

    void FixedUpdate()
    {
        if (CurrentState == State.CLIMB)
        {

        }
    }

}

线

if (CurrentState == State.CLIMB)

产生以下错误:运算符“==”不能应用于“Enum”和“Player.State”类型的操作数

有什么帮助吗?吸气剂工作正常。那么也许我需要在 set 访问器中进行强制转换?我不太确定...我对此有点陌生...任何帮助将不胜感激。

【问题讨论】:

  • 尝试将私有枚举更改为您的类对象之外的公共枚举
  • 什么让你困惑? CurrentStateEnum 类型,State.ClimbState 类型
  • 枚举 catch22 的简明答案位于此处:stackoverflow.com/questions/22335103/…
  • 你可以在这里查看如何比较枚举:stackoverflow.com/questions/19537083/…
  • 我认为您需要一个 CurrentState 属性来设置/获取 State 类型的值。 CurrentState 不应该是枚举。

标签: c# unity3d enums enumeration


【解决方案1】:

如果我用两个不同的访问器替换该属性,它似乎可以工作......

protected override Enum SetCurrentState
{
    set
    {
        _anim.SetInteger("State", Convert.ToInt32(value));
    }
}

private bool GetCurrentState(State state)
{
    return Convert.ToInt32((State)_anim.GetInteger("State")) == Convert.ToInt32(state);
}

【讨论】:

    【解决方案2】:

    试试这个:

    if (Convert.ToInt32(CurrentState) == Convert.ToInt32(State.CLIMB))
                { 
    
                }
    

    由于 Enum 不能作为类型进行比较,因此您需要将它们转换为比较。

    【讨论】:

    • 为什么要转换而不只是转换?
    • 这行得通,但我不能在每次有 if 语句时都将参数的两边都转换为 int32。
    【解决方案3】:

    如前文所述,Enum 的非法操作。不要那样做。

     namespace ConsoleApplication1
        {
            public enum State
            {
                IDLE = 0,
                WALK = 1,
                JUMP = 2,
                FALL = 3,
                CLIMB = 4,
                LOOKING_DOWN = 5,
                NPC = 6,
                IMPATIENT = 7,
                LOOKING_UP = 8,
                STUCK = 9,
            }
    
            public abstract class Character : MonoBehaviour
            {
                protected abstract State CurrentState
                {
                    get;
                    set;
                }
            }
    
    
            public class MonoBehaviour
            {
            }
    
            public class Player : Character
            {      
    
                protected override State CurrentState
                {
                    get
                    {
                        return (State)_anim.GetInteger("State");
                    }
                    set
                    {
                        _anim.SetInteger("State", Convert.ToInt32(value));
                    }
                }
    
    
    
                void FixedUpdate()
                {
                    if (CurrentState == State.CLIMB)
                    {
    
                    }
                }
    
            }
    
        }
    

    【讨论】:

    • 那么如果除 Player 之外的另一个对象继承自 Character,该对象应该在哪里定义其状态?
    • 枚举可以被命名空间以明确你需要哪一个。您可以将它们放在您想要的任何位置,但请记住 enum 有助于在您的代码中清楚地了解您期望的英文整数值。
    【解决方案4】:

    您将EnumState 进行比较。这是非法的。 CurrentState 的返回类型应为 State。有点像 -

    protected override State CurrentState
    {
        get
        {
            return (State)_anim.GetInteger("State");
        }
        set
        {
           _anim.SetInteger("State", Convert.ToInt32(value));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多