簡體   English   中英

如何處理您想要擴展的 class 被密封在 .NET 庫中?

[英]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"

VBA 演示

擴展方法是一種方法,另一種方法是適配器模式。 因此,您編寫了一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM