我已經提出了一個問題here,我基本上需要將基類的實例轉換爲子類(或使用基類屬性的實例創建的子類的新實例)。結論似乎是這樣做的最好方法是手動分配我需要在基類的構造函數中傳輸的每個屬性。爲什麼VB不允許從父類到子類的類型轉換?
儘管在某些情況下這是可行的,但它並不是在有很多屬性需要傳輸時,或者基類可能會發生變化時 - 每次向基類添加屬性時,構造函數都需要也改變了,所以這個解決方案不夠優雅。
我已經在網上搜索,並且看不到爲什麼這種類型鑄造沒有實現的任何理由。我迄今爲止所看到的論點描述了這種操作「沒有任何意義」(從汽車中製作小型貨車就是我看到的一個類比),質疑如何處理子類中的非繼承變量,或者聲稱必須爲嘗試實現的目標提供更好的解決方案。
據我所知,只要有用,操作不需要「有意義」,所以這不是一個很好的理由。添加更多屬性(也許方法/覆蓋它們)將實例更改爲子類有什麼不妥?在非繼承變量的情況下,只需通過允許這種類型轉換就可以解決這個問題 - 只需將一個構造函數添加到子類中,或者只需將它們設置爲其默認值。畢竟,施工人員通常都會撥打MyBase.New(...)
。使用基礎構造函數(基本上創建基礎的新實例)和使用已經初始化的實例之間有什麼區別?最後,我不認爲第三個論點是合理的 - 有些時候所有其他解決方案都不夠優雅。
所以最後,還有什麼其他理由爲什麼這種鑄造不被允許,並且有沒有一種優雅的方法來規避這種情況?
編輯:
因爲我不知道了很多關於這個話題,我想我的意思是說「轉換」,而不是「投」。我還會添加一個示例來展示我試圖成功的方式。只有在子類別初始化時才允許轉換:
Class BaseClass
Dim x as Integer
Dim y as Integer
End Class
Class Subclass1 : Inherits BaseClass
Dim z as Integer
Sub New(Byval value As Integer)
'Standard initialisation method
MyBase.New()
z = value
End Sub
Sub New(Byval value As Integer, Byval baseInstance As BaseClass)
'Type conversion from base class to subclass
baseInstance.passAllproperties()
'This assigns all properties of baseInstance belonging to BaseClass to Me.
'Properties not in BaseClass (eg. if baseInstance is Subclass2) are ignored.
z = value
End Sub
End Class
Class Subclass2 : Inherits BaseClass
Dim v As Integer
End Class
您需要更好地理解繼承和多態。你不能將基礎投射到後代,因爲通常不可能這樣做。你怎麼能把一隻動物當成一匹馬來對待它,當那隻動物可能是一隻貓或一隻海豹?當你試圖把馬鞍和馬繮放在他們身上並將他們騎在你的院子周圍時,貓和海豹會極力反對。如果你發現自己需要這樣做,這是你的課程設計或實施得不好的跡象。 –
@KenWhite我不同意。後裔在初始化時要求基地的一個實例用作模板有什麼問題? – Shuri2060
雖然這不是你的問題所要求的。你的問題是關於**基地**被投給**後代**,這是**完全相反的**。對於後代來說,要求父母(基礎)實例是很好的;例如,它在調用基礎構造函數時定期完成。你曾經問過做相反的事,這是你失敗的地方。 –