不完全。鑄造他們的基本類型,例如
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