隐藏继承的受保护方法

时间:2015-01-27 18:18:15

标签: c# inheritance protected

是否可以隐藏或阻止继承的protected virtualprotected abstract方法,以便进一步继承类无法访问它们?

例如:

class Base<T>
{
    protected abstract T CreateInstance();
}

class Derivative : Base<Derivative>
{
    protected sealed override Derivative CreateInstance()
    {
        return new Derivative();
    }
}

class MoreDerivative : Derivative
{
    public MoreDerivative()
    {
        // cannot access CreateInstance here
    }
}

我不认为它是用语言实现的,但也许有注释或类似的东西。

5 个答案:

答案 0 :(得分:4)

没有。当您为某个类型定义成员时,您会说该类型及其所有子类型都将具有该成员。没有办法“撤销”那个。这个假设是类型系统不可或缺的一部分。

您可能希望在此处考虑使用合成,而不是继承。创建一个类型为Derivative的字段,而不是从中继承。

答案 1 :(得分:1)

您可以根据您打算使用代表的精神来完成某些事情:

class Base<T>
{
    private readonly Func<T> _createInstance;

    public Base(Func<T> createInstance)
    {
        _createInstance = createInstance;
    }

    private T CreateInstance()
    {
        return _createInstance();
    }
}

class Derivative : Base<Derivative>
{
    public Derivative() : base(CreateInstance)
    {

    }

    private static Derivative CreateInstance()
    {
        return new Derivative();
    }
}

class MoreDerivative : Derivative
{
    public MoreDerivative()
    {
        // cannot access CreateInstance here
    }
}

非静态实施:

class Base<T>
{
    private readonly Func<Base<T>, T> _createInstance;

    public Base(Func<Base<T>, T> createInstance)
    {
        _createInstance = createInstance;
    }

    private T CreateInstance()
    {
        return _createInstance(this);
    }
}

class Derivative : Base<Derivative>
{
    public Derivative() : base(CreateInstance)
    {

    }

    private static Derivative CreateInstance(Base<Derivative> caller)
    {
        return ((Derivative)caller).CreateInstance();
    }

    private Derivative CreateInstance()
    {
        return new Derivative();
    }
}

class MoreDerivative : Derivative
{
    public MoreDerivative()
    {
        // cannot access CreateInstance here
    }
}

答案 2 :(得分:1)

对于其他在此处结束的人,您也可以创建一个内部虚方法,只要您想要查看该方法的唯一类在同一个程序集中。

答案 3 :(得分:0)

不,这是不可能的。为了坚持您的示例,MoreDerivative仍然是Base<Derivative>的子类型,Base<>包含CreateInstance方法。所以你必须才能访问该方法。如果你没有,你可以将对象转换为基类型然后访问它。

答案 4 :(得分:0)

Obsolete中尝试调用方法时,向Derivative.CreateInstance添加MoreDerivative注释会导致编译器警告。如果调用与声明不在同一解决方案中,则EditorBrowsable会隐藏IntelliSense中的方法。

[System.ComponentModel.EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("Method must only be invoked by the base class.", true)]
protected sealed override Derivative CreateInstance() { /*...*/ }