我已經爲我的類型開發了一些序列化代碼。它們都共享一個通用接口來促進序列化邏輯。是否也可以將該接口添加到一些基本類型,如Integer
或String
,以便我可以將這些基本類型值中的一個傳入我的序列化邏輯並使其工作?我正在想象一些沿着擴展方法的東西,但添加一個接口而不是一個方法?我敢肯定,我可以想出一些方法來使用後期綁定,但如果可能的話,我想避免這種情況。是否可以將接口添加到現有類型?
回答
不可以擴展現有類型以使其實現接口(即將Implements IMyInterface
添加到該類型代碼的頂部即可)。最接近的是創建一個將接口添加到基類的派生類。如果你覆蓋了CType
運算符,你甚至可以創建它,所以值可以無縫地從一個類型轉換到另一個類型,而無需明確地轉換它們。但是,由於您提到String
和Integer
作爲您想要擴展的類型,這是不可能的。您無法創建從String
繼承的新類型,因爲String
被定義爲NotInheritable
。同樣,您不能創建從Integer
繼承的新類型,因爲Integer
是Structure
,而不是Class
。結構不支持繼承。
因此,您擁有的最佳選擇是創建一個包裝核心值的新類,並通過實現接口來擴展它,然後重寫CType
運算符,以便在覈心類型和包裝類型。舉例來說,假設你有一個這樣的接口:
Public Interface IWritable
Sub Write()
End Interface
,你不得不說了一個該類型的參數的方法,像這樣:
Private Sub TestWrite(writableObject As IWritable)
writableObject.Write()
End Sub
如果你需要一個Integer
進入這個方法,你可以做一個包裝類是這樣的:
Public Class WritableInteger
Implements IWritable
Public Sub New(value As Integer)
Me.Value = value
End Sub
Public Property Value As Integer
Public Sub Write() Implements IWritable.Write
Console.Write(Value)
End Sub
Overloads Shared Widening Operator CType(value As Integer) As WritableInteger
Return New WritableInteger(value)
End Operator
Overloads Shared Widening Operator CType(value As WritableInteger) As Integer
Return value.Value
End Operator
End Class
由於CType
運算符重載爲Widening
,這意味着你可以共存在不投射的情況下顛倒兩種類型之間的值(即使使用Option Strict On
)。舉例來說,這個工程:
Dim w As WritableInteger = New WritableInteger(5)
Dim i As Integer = w
w = i
不幸的是,因爲TestWrite
是要求一個IWritable
而非WritableInteger
,你不能只是調用TestWrite
與Integer
,像這樣:
Dim i As Integer = 5
TestWrite(5) 'This won't work!
編譯器知道它需要將Integer
轉換爲IWritable
對象,但由於任何數量的類型都可以實現該接口,因此它不會自動嘗試確定它們中是否有任何一個爲此提供了一個CType
運算符。由於可能有多種類型,允許從Integer
到IWritable
的轉換範圍擴大,它只是舉起手和哭聲。因此,即使擴展轉換已被聲明,您仍然必須在類似的情況下明確地轉換類型。例如:
Dim i As Integer = 5
TestWrite(CType(i, WritableInteger))
或者更簡單地說:
Dim i As Integer = 5
TestWrite(New WritableInteger(5))
你可以做的所有常見類型,將需要包裹創造重載更方便。例如,如果你創建了一個超負荷的TestWrite
方法,像這樣:
Public Sub TestWrite(value As Integer)
TestWrite(New WritableInteger(value))
End Sub
然後,你可以很容易地調用它是這樣的:
TestWrite(5)
從IWritable
變量轉換回一個Integer
,雖然,更加困難。例如:
Dim w As IWritable = New WritableInteger(5)
Dim i As Integer = w ' This won't work!
Dim i2 As Integer = CType(w, Integer) ' Whis won't work either!
如果您需要做的是,你實際上必須首先將其轉換爲WritableInteger
(並知道它是擺在首位的是類型的對象),例如:
Dim w As IWritable = New WritableInteger(5)
If TypeOf w Is WritableInteger Then
Dim i As Integer = CType(w, WritableInteger)
End If
不幸的是,在保持編譯時類型檢查的安全性的同時,確實沒有辦法讓它更容易。最後還值得一提的是,如果你決定做一個這樣的包裝,並且無論包裝類型如何,接口的實現都是相同的,那麼你可以將它實現爲一個泛型類型,如下所示:
Public Class Writable(Of T)
Implements IWritable
Public Sub New(value As T)
Me.Value = value
End Sub
Public Property Value As T
Public Sub Write() Implements IWritable.Write
Console.Write(Value)
End Sub
Overloads Shared Widening Operator CType(value As T) As Writable(Of T)
Return New Writable(Of T)(value)
End Operator
Overloads Shared Widening Operator CType(value As Writable(Of T)) As T
Return value.Value
End Operator
End Class
然後,你可以調用TestWrite
方法是這樣的:
TestWrite(New Writable(Of Integer)(5))
TestWrite(New Writable(Of String)("Hello World"))
- 1. 可以將接口添加到現有的.NET類型嗎?
- 2. 是否可以將接口添加到.NET中的強類型數據集?
- 3. 是否可以將jframe表單添加到現有類中?
- 4. 是否可以將另一項添加到現有的枚舉類型?
- 5. 是否可以將「文本」添加到swig中的現有類型圖?
- 6. 是否可以通過DynamicProxy將屬性添加到類型?
- 7. 是否可以將globalize3添加到外部ActiveRecord模型類中?
- 8. 是否可以使用.NET泛型類實現COM接口?
- 9. IntelliJ是否可以將@Overrrides添加到特定接口的所有方法中?
- 10. 是否可以使用Paperclip將現有文件添加到模型中?
- 11. 是否可以添加類?
- 12. 是否可以通過jquery將css添加到現有的css類中?
- 13. 可以將接口添加到Docker容器以加速連接?
- 14. 是否可以將MouseMotionListener添加到BufferedImage?
- 15. 將aspect添加到實現類不是接口
- 16. 是否可以將內部接口擴展到其他類?
- 17. 是否可以爲類型的賦值添加類型轉換?
- 18. 將接口實現添加到ExpandoObject
- 19. 將事件添加到接口/實現
- 20. 在java中,是否可以將Serializable接口添加到在運行時沒有的類?
- 21. 將方法添加到Rails :: Application子類是否可接受?
- 22. 是否可以將ControlMaster添加到JSch連接?
- 23. 是否可以將超鏈接添加到UIAlertController?
- 24. 是否可以直接將按鈕添加到ScrolledComposite?
- 25. C#接口:是否可以引用在接口本身內實現接口的類型?
- 26. 是否有可能獲得實現接口的所有類?
- 27. 是否可以將方法添加到集合中的類中?
- 28. 是否可以將類添加到僞元素?
- 29. 是否可以將自定義類添加到QStandardItem?
- 30. 是否可以將類添加到自定義tinyMCE按鈕?
模糊的問題,你可能會想解釋越來越顯示出你的代碼 – stackunderflow
爲什麼不使用擴展方法,你建議? –
我希望能夠將對象作爲接口的實例傳遞給方法或集合。如果我通過擴展方法將它們作爲對象傳遞,則後期綁定對性能會產生相當嚴重的影響。此外,我一般不喜歡使用對象作爲類型,因爲我很迂腐。 –