Vb.net 跨派生类声明枚举

Vb.net 跨派生类声明枚举,vb.net,inheritance,enums,Vb.net,Inheritance,Enums,我正在用VB.NET开发一个程序 我有一个名为PriceType的枚举,它在一个超类ItemPriceBase中声明。有3个派生自ItemPriceBase的类-ItemPriceMeasured、ItemPriceNDI和ItemPriceExcost。这些类别的价格类型子集在每个类别中都是完全唯一的-测量价格为1到6,NDI价格为7到15,成本外价格为16到22 有没有办法在超类中声明枚举,然后在每个派生类中扩展枚举,以便它们只能访问这些选项,但我仍然可以访问超类中返回PriceType枚举

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

我有一个名为PriceType的枚举,它在一个超类ItemPriceBase中声明。有3个派生自ItemPriceBase的类-ItemPriceMeasured、ItemPriceNDI和ItemPriceExcost。这些类别的价格类型子集在每个类别中都是完全唯一的-测量价格为1到6,NDI价格为7到15,成本外价格为16到22

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

谢谢,
丹麦。

枚举只能使用内置整数类型。不能从枚举派生;它们是隐式密封的


所有枚举都派生自
System.Enum
,后者派生自
System.ValueType
,并且它们是
密封的
,也就是说,您不能从它们派生。

不完全如此。由于枚举实际上只是整数,因此可以执行以下操作:

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语句或绑定检查,并且派生类都会覆盖相关方法,像这样:

基类:

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
请注意,这仅适用于线性继承链-例如,如果在同一级别上存在同级派生类,则会发生故障,因为它们很难将枚举值正确地传递给正确的同级,而不是只处理更有限范围的父级


一般来说,对于开放式扩展性,我不推荐这种方法。正如您所见,这是一场维护噩梦。如果您有一个定义良好的、范围明确的使用集,并且这些使用集大部分都是固定的,那么这是可行的。

在这种情况下,我通常使用枚举对象而不是枚举类型。 例如:

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){}
}

枚举是整数类型。我希望能够向派生类中的枚举添加更多成员,并且使派生类只能访问在该类和超类中声明的成员。您不需要所有这些退出选择。无论如何,它不是级联的