不完全。铸造他们的基本类型,例如
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
注意这仅适用于线性继承链 - 例如,如果在同一级别上有兄弟派生类,则它会崩溃,因为它们很难将枚举值正确地交给正确的兄弟,而不是仅处理更有限范围的父项。
一般来说,我不会推荐这种开放式可扩展性的方法。正如你所看到的,这是一场维护噩梦。如果你有一个定义明确的,范围广泛的用途集,那么这是可行的。
你不需要所有这些退出选择。无论如何,它不会级联 – Pondidum 2009-09-22 06:52:04