Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的抽象枚举#_C#_.net_Inheritance_Enums_Abstract - Fatal编程技术网

C# c语言中的抽象枚举#

C# c语言中的抽象枚举#,c#,.net,inheritance,enums,abstract,C#,.net,Inheritance,Enums,Abstract,有没有办法在C#中创建(protected)enumabstract? 基类的示例: protected abstract enum commands{}; //CS0106 protected abstract void useCommands(commands meh); 由于“abstract对此项无效”,因此无法编译此项。“ 是否有实现所需行为的有效方法?否。枚举是枚举,而不是类。只有类可以抽象,因为只有类可以继承。抽象的意义在于提供一个公共基础,该基础将被其他类型

有没有办法在C#中创建(
protected
enum
abstract

基类的示例:

protected abstract enum commands{}; //CS0106        
protected abstract void useCommands(commands meh);  
由于“
abstract
对此项无效”,因此无法编译此项。“

是否有实现所需行为的有效方法?

否。
枚举
枚举
,而不是
。只有
可以
抽象
,因为只有
可以继承。抽象的意义在于提供一个公共基础,该基础将被其他类型继承。
enum
不会继承任何内容,因此如何实现或扩展
abstract
enum
呢?

enum是一个关键字,而不是类名:

所以你的代码应该是

  // 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;
    }
  }
  • 所有枚举必须派生自
    System.Enum
  • 所有枚举都是值类型,因此是密封的

  • 由于以上两条规则,您无法继承枚举。

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

    这可以通过使用泛型类并将
    enum
    作为模板类型传递来实现。 下面是一个如何实现这一点的示例

    public abstract baseClass <commandType>
    {
        protected abstract void useCommands (commandType meh);
        .
        .
        .
    }
    
    公共抽象基类
    {
    受保护的抽象命令(commandType meh);
    .
    .
    .
    }
    
    这可以在以后导出,以便按如下方式使用:

    public enum commands {stop, wait, go};
    
    public class derivedClass : baseClass <commands>
    {
        protected override void useCommands (commands meh)
        {
             .
             .
             .
        }
    }
    
    public enum命令{stop,wait,go};
    公共类派生类:基类
    {
    受保护的替代无效命令(命令meh)
    {
    .
    .
    .
    }
    }
    
    抽象枚举的目的是什么?除了使用字符串来管理状态之外。。。否。
    enum
    是一个关键字,使用
    enum
    作为类名使用带有静态字符串属性的静态类,仅使用get方法…@Mark
    enum
    不能作为任何内容的基类型。“enum是一个enum”?enum是一种值类型,不仅类可以继承。字段、方法和属性,所有这些都是
    abstract
    。@标记,字段、方法和属性不是类型。创建派生类型时,该类型只能从
    派生。无法创建从字段、方法或属性派生的类型。当你继承一个类的时候,你当然会继承它的成员,但这不是一回事。我当然可以看到枚举是如何被“扩展”的。如果两个枚举共享其值的公共子集,那么公共范围可以称为子类型。这只是一个避免类型定义重复的问题。我看到了很多陷阱,但收获不多。@jmchiliney值类型包括两大类:结构和枚举。与引用类型不同,不能从值类型派生新类型。但是,与引用类型一样,结构可以实现接口。说“枚举就是枚举”就像说“量子物理就是量子物理”。第二个问题确实能帮助我理解为什么这个问题不能像我想的那样解决。
    public enum commands {stop, wait, go};
    
    public class derivedClass : baseClass <commands>
    {
        protected override void useCommands (commands meh)
        {
             .
             .
             .
        }
    }