2009-09-21 189 views
0

我正在VB.NET中開發一個程序。在派生類中聲明枚舉

我有一個名爲PriceType的枚舉,它在超類ItemPriceBase中聲明。有3個類派生自ItemPriceBase - ItemPriceMeasured,ItemPriceNDI和ItemPriceExtraCost。 PriceTypes這些​​類的子集是從每個完全獨特的 - 測量的價格是1到6,NDI價格是7到15和ExtraCost價格是16至22

有沒有辦法申報枚舉在超類和然後擴展每個派生類中的枚舉,以便它們只能訪問這些選項,但仍然可以訪問返回枚舉PriceType的超類中的屬性?

謝謝, 丹麥人。

回答

1

不完全。鑄造他們的基本類型,例如

Enum BaseTypes 
    A = 1 
    B 
    C 
End Enum 

'start with an arbitrarily high number to avoid colliding with BaseTypes 
Enum DerivedTypes 
    D = 10 
    E 
    F 
End Enum 

'ditto 
Enum OtherDerivedTypes 
    G = 20 
    H 
    I 
End Enum 

您可以通過派生類型分爲預期基本類型的方法:由於枚舉其實只是整數,你可以做這樣的事情(BaseTypes)DerivedTypes.E這隻會假設你沒有做任何非虛case語句或在您的BaseClass和你的派生類的約束,檢查每個覆蓋相關的方法,像這樣當然工作:

基類:

Private Overridable Sub HandleValue(ByVal val As BaseTypes) 
    Select Case val 
     Case BaseTypes.A 
      'do something 
      Exit Select 
     Case BaseTypes.B 
      'do something else 
      Exit Select 
    End Select 
End Sub 

派生類:

Private Overloads Overrides Sub HandleValues(ByVal val As BaseTypes) 
    Select Case DirectCast(val, DerivedTypes) 
     Case DerivedTypes.D 
      'do something D-ish 
      Exit Select 
     Case DerivedTypes.E 
      'do something E-like 
      Exit Select 
     Case Else 
      'what we got wasnt a DerivedType, pass it off to the base 
      MyBase.HandleValues(val) 
      Exit Select 
    End Select 
End Sub 

注意這僅適用於線性繼承鏈 - 例如,如果在同一級別上有兄弟派生類,則它會崩潰,因爲它們很難將枚舉值正確地交給正確的兄弟,而不是僅處理更有限範圍的父項。

一般來說,我不會推薦這種開放式可擴展性的方法。正如你所看到的,這是一場維護噩夢。如果你有一個定義明確的,範圍廣泛的用途集,那麼這是可行的。

+0

你不需要所有這些退出選擇。無論如何,它不會級聯 – Pondidum 2009-09-22 06:52:04

1

枚舉只能使用內建的整數類型。你不能從Enum派生出來;它們被隱式密封。

所有的枚舉派生自System.Enum,派生自System.ValueType,他們是sealed,即你不能從它們派生。

+0

枚舉是整數類型。我希望能夠在派生類中爲枚舉添加更多成員,並讓派生類只能訪問那些在該類和超類中聲明的成員。 – link664 2009-09-21 05:35:10

0

在這種情況下,我通常使用枚舉對象而不是枚舉類型。 例如:

public class BaseEnumType 
{ 
public readonly static BaseEnumType A=new BaseEnumType(0,"A"); 
public readonly static BaseEnumType B=new BaseEnumType(10,"B"); 
public readonly static BaseEnumType C=new BaseEnumType(20,"C"); 
public readonly static BaseEnumType[] AllBase=new []{A,B,C}; 
public int Value{get;private set;} 
public string Name {get;private set;} 
protected BaseEnumType(int value,string name) 
{ 
Value=value; 
Name=name; 
} 

} 

然後就可以從這個BaseEnumType導出:

public class ChildEnumType:BaseEnumType 
{ 
public readonly static ChildEnumType D=new ChildEnumType(30,"D"); 
public readonly static ChildEnumType[] AllChild=new []{A,B,C,D}; 

protected ChildEnumType(int value,string name):BaseEnumType(value,name){} 
}