Pas exactement. Étant donné que les énumérations sont vraiment juste des entiers, vous pouvez faire quelque chose comme ceci:
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
Vous pouvez passer les types dérivés dans une méthode qui attend le type de base en les jetant comme le type de base, par exemple (BaseTypes)DerivedTypes.E
Cela ne fonctionnera bien sûr en supposant que vous ne faites pas des déclarations de cas non-virtuelle ou lié à la vérification dans votre BaseClass
et vos classes dérivées redéfinissent les méthodes pertinentes, comme suit:
Classe de base:
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
classe dérivée:
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
Notez que ce ne fonctionne que pour une chaîne de succession linéaire - par exemple, il se décompose s'il y a des classes dérivées de même niveau, car il devient très difficile pour eux de transmettre correctement les valeurs d'énumération au bon frère, plutôt qu'à un parent qui a simplement une portée plus limitée.
En général, je ne recommanderais pas cette approche pour l'extensibilité ouverte. Comme vous pouvez le voir, c'est un cauchemar de maintenance. Si vous disposez d'un ensemble d'utilisations bien défini et délimité qui sera principalement défini dans la pierre, alors cela est réalisable.
vous n'avez pas besoin de tous ces sélections de sortie. Ce n'est pas en cascade de toute façon – Pondidum