Search code examples
c#enumsvirtualparent

C# enum in interface/base class?


i have problem with enum

I need make a enum in base class or interface (but empty one)

class Base 
{
   public enum Test;
   // ???
}

and after make diffrent enums in some parent classes

class Parent1
{
   public enum Test {A, B, C};
}

class Parent2
{
   public enum Test {J, H, K};
}

and now i have next class with method when i have to use enum

class Test<T>
{
   public void Foo(Test enum)
   {
      int value = (int) enum;
      // ...
   }
}

It's there any way to do something like that ?

If not i have to use static ints in every class ...

class Parent1
{
   public static int A = 0;
   public static int B = 5;
   public static int C = 7;
}

class Parent2
{
   public static int J = 1;
   public static int H = 3;
   public static int K = 6;
}

class Test<T>
{
   public void Foo(int enum)
   {
      int value = enum;
      // ...
   }
}

I't looks bad in code ... in some classes i have to use ~20+ variables


Solution

  • There is no such thing as an abstract enum (that can have different implementations in subclasses) - but generics may be an option:

    class Base<T> where T : struct {
        private T value;
        public void Foo(T value) {
            this.value = value;
        }
    }
    class Parent1 : Base<Parent1.Enum1> {
        public enum Enum1 {A, B, C};
    }
    class Parent2 : Base<Parent2.Enum2> {
        public enum Enum2 { J, H, K };
    }
    

    The only problem is that this doesn't enforce that only enums are usable - you can do this at runtime, though - for example in a type initializer:

    static Base() {
        if (!typeof(T).IsEnum) throw new InvalidOperationException(
             typeof(T).Name + " is not an enum");
    }