Vb.net 跨派生类声明枚举
我正在用VB.NET开发一个程序 我有一个名为PriceType的枚举,它在一个超类ItemPriceBase中声明。有3个派生自ItemPriceBase的类-ItemPriceMeasured、ItemPriceNDI和ItemPriceExcost。这些类别的价格类型子集在每个类别中都是完全唯一的-测量价格为1到6,NDI价格为7到15,成本外价格为16到22 有没有办法在超类中声明枚举,然后在每个派生类中扩展枚举,以便它们只能访问这些选项,但我仍然可以访问超类中返回PriceType枚举的属性 谢谢,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枚举
丹麦。枚举只能使用内置整数类型。不能从枚举派生;它们是隐式密封的
所有枚举都派生自
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){}
}
枚举是整数类型。我希望能够向派生类中的枚举添加更多成员,并且使派生类只能访问在该类和超类中声明的成员。您不需要所有这些退出选择。无论如何,它不是级联的