繁体   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