Не совсем. Поскольку перечисления на самом деле просто целые числа, вы можете сделать что-то вроде этого:
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
Обратите внимание, что это работает только для линейной цепочки наследования - например, он ломается, если на том же уровне существуют производные классы одного уровня, так как для них становится очень трудно правильно передать значения перечисления правильному элементу, а не родителю, который просто имеет дело с более ограниченной областью действия.
Как правило, я бы не рекомендовал такой подход для расширяемости с открытым исходным кодом. Как видите, это кошмар обслуживания. Если у вас есть четко определенный набор областей применения, который в основном будет установлен в камне, то это выполнимо.