在派生类中声明枚举

时间:2009-09-21 05:27:54

标签: vb.net inheritance enums

我正在用VB.NET开发一个程序。

我有一个名为PriceType的枚举,它在超类ItemPriceBase中声明。有3个类派生自ItemPriceBase - ItemPriceMeasured,ItemPriceNDI和ItemPriceExtraCost。这些类别的PriceTypes子集各自完全独特 - 测量价格为1到6,NDI价格为7到15,ExtraCost价格为16到22.

有没有办法在超类中声明枚举,然后在每个派生类中扩展枚举,以便它们只能访问这些选项,但我仍然可以访问返回枚举的超类中的属性PriceType?

谢谢, 戴恩。

3 个答案:

答案 0 :(得分:1)

枚举只能使用内置整数类型。你无法从Enum中获得;他们被隐瞒了。

所有枚举均来自System.Enum,其源自System.ValueType,且为sealed,即您无法从中获取。

答案 1 :(得分: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这只会假设您在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

注意这仅适用于线性继承链 - 例如如果在同一级别上存在同级派生类,则会发生故障,因为它们很难将枚举值正确地移交给正确的兄弟,而不是仅仅处理更有限范围的父级。

通常我不建议这种方法用于开放式可扩展性。如你所见,这是一场维护噩梦。如果你有一个明确定义的范围使用集,它将大部分都是一成不变的,那么这是可行的。

答案 2 :(得分: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){}
}