为什么不能重写受保护的内部方法

本文关键字:内部 方法 受保护 不能 重写 为什么 | 更新日期: 2023-09-27 18:04:03

c#避免用户重写内部受保护的方法。我知道有人问过这个问题,我找到了Eric Lippert的例子。但我不认为这是个好主意。下面是我的例子:

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

在这种情况下,Method2可以被B1访问,而不能被c访问。但是由于内部保护不能被重写,这样做将不方便。你们是怎么想的?

---- add comment ---------

我的目的很明确。我想让Method2可以被B1访问,我不想让Method2被C访问。问题是c#不允许覆盖"内部保护"。

----再次添加注释---------

好了,我现在知道是什么问题了。这个问题很简单,但是Eric Lippert的例子让它变得复杂了。

为什么不能重写受保护的内部方法

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

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