【问题标题】:Abstract enum in c#c#中的抽象枚举
【发布时间】:2014-10-14 06:32:19
【问题描述】:

有没有办法在 C# 中创建 (protected) enum abstract
基类示例:

protected abstract enum commands{}; //CS0106        
protected abstract void useCommands(commands meh);  

这无法编译,因为“abstract 对此项目无效”。
有没有一种可行的方法来实现所需的行为?

【问题讨论】:

  • 抽象枚举的目的是什么?
  • 缺少使用字符串来管理您的状态...没有。
  • enum是关键字,使用Enum作为类名
  • 使用带有静态字符串属性的静态类,只有 get 方法...
  • @Mark enum 不能是任何东西的基本类型。

标签: c# .net inheritance enums abstract


【解决方案1】:

枚举关键字,而不是类名

  // MyCommand is a class name while 'enum' is a keyword
  public enum MyCommand {
    None,
    Something
  }

所以你的代码应该是

  // Enum (but not enum) is a class name: 
  // Enum is an abstract class for any enum (including MyCommand)
  protected abstract Enum commands {
    get;
  }; 

可能的抽象属性实现可能是:

  protected override Enum commands {
    get { 
      return MyCommand.None;
    }
  }

【讨论】:

    【解决方案2】:
    1. 所有枚举必须派生自System.Enum
    2. 所有枚举都是值类型,因此是密封的。

    由于以上两条规则,你不能继承枚举。

    【讨论】:

    • 第二个 relly 帮助我理解了为什么这不能像我想象的那样工作。
    【解决方案3】:

    如果我理解你的话,你正在尝试创建一个有点类似于状态机的抽象类。您有一个 enum 存储您希望派生类定义的命令。

    这可以通过使用泛型类来实现,并将您的enum 作为模板类型传递。 以下是如何实现此目的的示例。

    public abstract baseClass <commandType>
    {
        protected abstract void useCommands (commandType meh);
        .
        .
        .
    }
    

    这可以稍后推导出来使用如下:

    public enum commands {stop, wait, go};
    
    public class derivedClass : baseClass <commands>
    {
        protected override void useCommands (commands meh)
        {
             .
             .
             .
        }
    }
    

    【讨论】:

      【解决方案4】:

      没有。 enumenum,而不是 class。只有class 可以是abstract,因为只有class 可以被继承。抽象的意义在于提供一个可以被其他类型继承的通用基础。 enum 没有继承任何东西,那么如何实现或扩展 abstract enum

      【讨论】:

      • “枚举是一个枚举”? enum 是一个值类型
      • 不仅类可以被继承。字段、方法和属性也是如此,所有这些都是abstract
      • @Mark,字段、方法和属性不是类型。创建派生类型时,该类型只能从class 派生。您不能创建从字段、方法或属性派生的类型。当你继承一个类时,你当然会继承它的成员,但这不是一回事。
      • 我当然可以看到如何“扩展”枚举。如果两个枚举共享其值的公共子集,那么公共范围可以称为子类型。这只是避免类型定义重复的问题。我看到很多陷阱,但收获不多。
      • @jmcilhinney 值类型包括两个主要类别:结构和枚举。与引用类型不同,您不能从值类型派生新类型。然而,像引用类型一样,结构可以实现接口。 msdn.microsoft.com/en-us/library/s1ax56ch.aspx 说“枚举是枚举”就像说“量子物理学是量子物理学”。只需在答案中表现出更多的努力。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 2022-06-25
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多