[英]How to handle a class you want to extend which is sealed in the .NET library?
我正在某處閱讀有關如何處理希望在 .NET 框架庫中擴展密封 class 的問題。
這通常是一項常見且有用的任務,因此我開始思考,在這種情況下,有哪些解決方案? 我相信在我閱讀的文章中演示了一種“方法”來擴展密封的 class,但我現在不記得了(它不是擴展方法)。
還有其他方法嗎? 謝謝
有“假”inheritance。 也就是說,您實現基本 class 和其他 class 實現的任何接口:
// Given
sealed class SealedClass : BaseClass, IDoSomething { }
// Create
class MyNewClass : BaseClass, IDoSomething { }
然后你有一個私人成員,我通常稱之為 _backing,因此:
class MyNewClass : BaseClass, IDoSomething
{
SealedClass _backing = new SealedClass();
}
這顯然不適用於具有以下簽名的方法:
void NoRefactoringPlease(SealedClass parameter) { }
如果您想要擴展的 class 在某個時候從 ContextBoundObject 繼承,請查看這篇文章。 前半部是COM,后半部.Net。 它解釋了如何代理方法。
除此之外,我什么都想不出來。
這個方法可能上面已經提到了它的正式名稱,但我不知道它的正式名稱,所以在這里。 此示例“擴展”了 TextBox class(VB 中的示例)。 我相信這種方法的一個優點是您不需要顯式編碼或公開內置成員。 希望這是相關的:
VB Class 模塊“MyTextBox”:
public Base as TextBox, CustomProperty as Integer
Private Sub Init(newTextBox as TextBox)
Set Base = newTextBox
End Sub
public Property Get CustomProperty2() As String
CustomProperty2 = "Something special"
End Property
要調用代碼,您可能會說:
Dim MyBox as New MyTextBox
MyBox.Init MyForm.TextBox3
從這里您可以訪問所有內置成員,以及您的自定義成員。
Debug.Print MyBox.Base.Text
MyBox.CustomProperty = 44
為了進一步完善,您可以將 Base 設為 class 的默認屬性,然后在調用 Base class 的屬性時可以省略“Base”。 你這樣稱呼 Base 成員:
Debug.Print MyBox().Text
MyBox().Text = "Hello World"
擴展方法是一種方法,另一種方法是適配器模式。 因此,您編寫了一個 class ,它將一些調用委托給您要擴展的密封調用,並添加其他調用。 這也意味着您可以將界面完全適應您的應用程序認為更合適的東西。
也許使用裝飾器模式?
除了擴展方法,這是我能想到的唯一明智的技術。
不,您不能以任何合法方式擴展密封的 class。
TypeMock允許您模擬密封類,但我懷疑它們會鼓勵您對生產代碼使用相同的技術。
如果一個類型已經被密封,這意味着 class 設計者沒有為 inheritance 設計它。 那時將它用於 inheritance 可能會給您帶來很多痛苦,無論是現在還是以后更改實施時。
更喜歡 inheritance 的組合 - 根據我的經驗,它更強大。 有關更多信息,請參見“有效 Java(第 2 版)”中的第 16 項。
我知道在沒有擴展方法的情況下“擴展”密封的 class 的唯一方法是包裝它。 例如:
class SuperString
{
private String _innerString;
public SuperString(String innerString)
{
_innerString = innerString;
}
public int ToInt()
{
return int.Parse(_innerString);
}
}
您需要公開所有與字符串 class 相同的方法/屬性。
一些框架允許您擴展現有對象。 在 WPF 中,請參閱依賴屬性。 對於 Windows Forms,請參閱IExtenderProvider 。
擴展方法怎么樣? 您可以通過這種方式“添加”其他方法,而無需處理 inheritance 限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.