You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让基类私有方法在基类内部调用时也对派生类隐藏?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:11:02