2017-08-02 43 views
9

我有一個基類和從它派生的幾個類。c#如何寫返回枚舉的抽象方法

我想在基類中聲明一個枚舉作爲抽象,並且從它派生的每個類都必須創建它自己的不同枚舉。

我該怎麼辦?

我試過如下:聲明在基類返回枚舉類型實現它會返回自己的枚舉抽象方法和每個類:

public abstract enum RunAtOptions(); 

但我得到的編譯錯誤

"The modifier abstract is not valid for this item" 
+0

枚舉是一個類型,你不能有抽象類型...... –

+4

有辦法來模擬這一點,但我懷疑你不真的需要這個,它看起來像一個[XY問題](http://xyproblem.info/)。 –

+0

你的意思是你想要改變基於派生類返回哪個枚舉?那麼,泛型? – DavidG

回答

5

您需要返回實際的枚舉不是enum關鍵字,所以如果你有enumMyEnumType這樣的:

public enum MyEnumType 
{ 
    ValueOne = 0, 
    ValueTwo = 1 
} 

public abstract MyEnumType RunAtOptions(); 

如果你想修改這個使用泛型你可以有方法返回T,並有一個約束,使T一個結構:

public abstract T RunAtOptions() where T : struct; 

C#沒有一個泛型約束,支持枚舉類型。

+0

是的,但是「MyEnumType」是要解決的問題。 –

+1

編輯了顯示枚舉定義的答案。 –

+2

_「和每個從它派生的類將不得不創建自己的不同的枚舉」_ –

1

您不能將enum關鍵字用作抽象成員。Similar question

或者,您可以引入一個抽象字典屬性。

public class Base 
{ 
    public abstract Dictionary<string, int> RunAtOptions { get; } 
} 

派生類可以在構造函數中設置屬性。

public class Derived : Base 
{ 
    public override Dictionary<string, int> RunAtOptions { get; } 

    public Derived() 
    { 
     RunAtOptions = new Dictionary<string, int> 
     { 
      ["Option1"] = 1, 
      ["Option2"] = 2 
     } 
    } 
} 

不幸的是使用這種方法不會給你優雅的編譯時檢查。有了這本字典,你可以對條目在字典中類似這樣的比較選項的值:

if (someObject.Options == RunAtOptions["Option1"]) // someObject.Options is of type `int` 
{ 
    // Do something 
}