为什么不能重写受保护的内部方法
本文关键字:内部 方法 受保护 不能 重写 为什么 | 更新日期: 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,并且它将通过在受保护范围内获得访问权。然后,您可以按照预期通过本地类型调用这些方法。