如何让基类私有方法在基类内部调用时也对派生类隐藏?
解决C#中基类私有方法被自身通过派生类实例调用的问题
问题根源
C#的私有成员采用类级访问权限,而非实例级。也就是说,基类A的所有代码,都能访问任何A类型实例(包括派生类B的实例,因为B实例本质上包含完整的A基类部分)的私有成员。这就是为什么A内部能通过new B().foo()调用私有方法foo。
解决方案
根据foo是否需要访问实例成员,有两种可行方案:
方案1:将foo改为私有静态方法(适用于无需访问实例成员的场景)
如果foo不需要操作实例字段或属性,直接改为静态私有方法,就能禁止通过任何实例(包括B的实例)调用它:
public class A { private static void foo() { } public void bar() { // new B().foo(); 编译错误:无法通过实例调用静态方法 // B.foo(); 编译错误:无法通过派生类访问基类私有静态成员 A.foo(); // 仅允许通过基类自身调用 } } public class B : A { }
方案2:将foo移至私有嵌套类(适用于需要访问实例成员的场景)
如果foo必须操作A的实例成员,可以把它封装到A内部的私有嵌套类中,让A的其他代码只能通过嵌套类实例调用foo,无法通过B实例访问:
public class A { private class PrivateMethodContainer { private readonly A _owner; public PrivateMethodContainer(A owner) { _owner = owner; } public void foo() { // 在这里可以访问_owner的实例成员 // 例如:_owner.SomeInstanceField = ...; } } public void bar() { // new B().foo(); 编译错误:B没有foo方法 new PrivateMethodContainer(this).foo(); // 仅允许通过嵌套类实例调用 } } public class B : A { }
这样无论外部还是基类内部,都无法通过B的实例调用到原有的foo逻辑,实现了完全隐藏的效果。
内容的提问来源于stack exchange,提问作者Ferdossi
相关产品推荐
相关产品推荐

