为什么不能覆盖受保护的内部方法?

时间:2016-08-25 01:10:09

标签: c# .net inversion-of-control virtual-method

C#避免用户覆盖内部受保护的方法。我知道这个问题已被提出,我发现了Eric Lippert's example。但我并不认为这是一个好主意。这是我的例子:

// A.dll
public abstract class A {
    public abstract void Method1(); 
    internal protected abstract void Method2(); 
}

// B.dll, ref A.dll
public class B : A {
    public override void Method1(); 
    internal protected override void Method2(); 
}

public class B1 {
    public void MethodC(){
        var b = new B();
        // can access b.Method1
        // can access b.Method2
    }
}

// C.dll, ref A.dll and B.dll
public class C {
    public void MethodC(){
        var b = new B();
        // can access b.Method1
        // can not access b.Method2
    }
}

在这种情况下,方法2可以由B1访问,而不是由C访问。但由于内部受保护不能被覆盖,这样做是不方便的。你们怎么想呢?

----添加评论---------

我的目的很清楚。我想让B1可以访问Method2,我不希望C访问Method2。 问题是C#不允许覆盖"内部受保护"。

----再次添加评论---------

嗯,我知道现在的问题是什么。这个问题很容易,但Eric Lippert的例子让它变得复杂。

1 个答案:

答案 0 :(得分:0)

内部修饰符表示同一程序集的成员可以访问它。如果C类在不同的程序集中,它将无法看到它引用的程序集的内部方法。如果需要外部程序集才能访问程序集的内部成员,则可以将InternalsVisisbleToAttribute添加到程序集B的程序集信息中,以授予对程序集C的访问权限。

或者,您可以让外部程序集中的类型继承自类型B,并且可以通过在受保护的范围内获得访问权限。然后,您可以按预期通过本地类型调用方法。