簡體   English   中英

如何從派生類隱藏擴展方法?

[英]How to hide extension methods from derived classes?

我有一個基本抽象類來實現模板方法模式。

public abstract class OptionalParameter
{
    //Template Method Pattern
    public string GenerateQueryString()
    {
        return this.GenerateQueryStringWithParameters();
    }
}

我有一個所有OptionalParameter類型的擴展方法。

public static class OptionalParameterExtensions
{
    public static string GenerateQueryStringWithParameters(this OptionalParameter optionalParameters)
    {

    }
}

我從OptionalParameter繼承了一個名為CalendarEventParameter的類。

public class CalendarEventParameters : OptionalParameter
{

}

當我想創建CalenderEventParameter的實例時,我在抽象類和GenerateQueryStringWithParameters()擴展方法中都看到了GenerateQueryString()方法。

我不想從派生類中看到它。 我試圖將擴展方法簽名為Private,但這樣我也無法從我的抽象類訪問。

是否可以僅從基本抽象類調用擴展方法?

不能。擴展方法通常不能從派生類中隱藏。

只有當另一個類在擴展方法的所有調用者之外的另一個組件內時才可能(您可以將擴展方法標記為internal )。

您還可以將擴展方法放在另一個名稱空間中,該名稱空間包含在要調用擴展方法的每個類文件中。 這不是真正的隱藏,但它可能會起作用。

首先,如果您只想要一個類的擴展方法,並且您可以控制該類。 您可以使該方法成為該類的成員。 第二,你想要一個方法存在於一個類,但在其派生類上? 這不是它應該如何工作。

嘗試將該方法設為內部,這樣您就可以完全控制調用它的位置。 如果你需要它是公共的,你可以讓它屬於一個接口,並使用一個隱式實現,這樣只有在你強制轉換對象時它才可用。

您也可以考慮隱藏智能感知中的成員,或者使其過時...

但老實說,OOP不應該如何工作,重新考慮你的設計。


值得注意的是,如果您的擴展方法具有與實際方法相同的名稱和簽名,則實際方法會優先考慮。 所以你可以擁有基類的擴展方法,並在派生類中添加一個實際的方法......

如果你這樣做,為什么yuu只有一個方法並使其成為虛擬。 因此派生類可以替換實現。


查看您的模式 - 請參閱代碼中的注釋:

public abstract class OptionalParameter
{
    public string GenerateQueryString()
    {
        // You are calling the extension method here
        return this.GenerateQueryStringWithParameters();
    }
}

這意味着擴展方法是默認實現。 只需將該方法設為虛擬:

public abstract class OptionalParameter
{
    public virtual string GenerateQueryString()
    {
        // Default implementation, whatever
    }
}

然后,您可以替換實現:

public class CalendarEventParameters : OptionalParameter
{
    public override string GenerateQueryString()
    {
        // Custom implementation
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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