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的例子让它变得复杂。
答案 0 :(得分:0)
内部修饰符表示同一程序集的成员可以访问它。如果C类在不同的程序集中,它将无法看到它引用的程序集的内部方法。如果需要外部程序集才能访问程序集的内部成员,则可以将InternalsVisisbleToAttribute添加到程序集B的程序集信息中,以授予对程序集C的访问权限。
或者,您可以让外部程序集中的类型继承自类型B,并且可以通过在受保护的范围内获得访问权限。然后,您可以按预期通过本地类型调用方法。