如何从派生 类 中隐藏扩展方法?

How to hide extension methods from derived classes?

我有一个基本抽象 class 来实现模板方法模式。

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)
    {

    }
}

我从名为 CalendarEventParameter 的 OptionalParameter 中继承了一个 class。

public class CalendarEventParameters : OptionalParameter
{

}

当我想创建 CalenderEventParameter 的实例时,我看到 GenerateQueryString() 抽象方法 class 和 GenerateQueryStringWithParameters() 扩展方法。

我不想从派生的 classes 中看到它。我尝试将扩展方法签名为 Private,但这样我也无法从我的摘要 class 访问。

是否可以仅从基础抽象调用扩展方法class?

没有。扩展方法通常不能从派生的 classes.

中隐藏

只有当另一个class在另一个程序集中而不是扩展方法的所有调用者时才有可能(您可以标记扩展方法internal)。

您还可以将扩展方法放在另一个命名空间中,您可以将其包含在要调用扩展方法的每个 class 文件中。这不是真正的隐藏,但它可以完成这项工作。

首先,如果您只需要 class 的扩展方法,并且您可以控制 class。您可以使该方法成为 class 的成员。 其次,您希望方法存在于 class 上但存在于其派生的 classes 上?这不是它应该的工作方式。

尝试将该方法设为内部方法,这样您就可以完全控制它的调用位置。如果你需要它是public,你可以让它属于一个接口,并使用隐式实现,这样它只有在你转换对象时才可用。

您还可以考虑从智能感知中隐藏该成员,或使其过时...

但老实说,这不是 OOP 的工作方式,请重新考虑您的设计。


可能值得注意的是,如果您的扩展方法与实际方法具有相同的名称和签名,则实际方法优先。因此,您可以为基础 class 添加扩展方法,并在派生 classes...

中添加实际方法

如果你这样做,你为什么不直接使用一个方法并将其虚拟化。所以派生的class可以代替实现


查看您的模式 - 查看代码中的注释:

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
    }
}