2009-09-21 124 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){} 
}