我正在用VB.NET开发一个程序。
我有一个名为PriceType的枚举,它在超类ItemPriceBase中声明。有3个类派生自ItemPriceBase - ItemPriceMeasured,ItemPriceNDI和ItemPriceExtraCost。这些类别的PriceTypes子集各自完全独特 - 测量价格为1到6,NDI价格为7到15,ExtraCost价格为16到22.
有没有办法在超类中声明枚举,然后在每个派生类中扩展枚举,以便它们只能访问这些选项,但我仍然可以访问返回枚举的超类中的属性PriceType?
谢谢, 戴恩。
答案 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){}
}