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

C#如何阻止派生类实例访问基类的public成员?

问题解答

首先明确结论:该需求可以实现,核心是调整基类成员的访问修饰符,不需要额外复杂逻辑。

实现方案

C# 内置的protected访问修饰符刚好完全匹配你的需求:被protected修饰的成员仅允许所属类自身、以及该类的派生类内部访问,完全禁止类外部通过实例直接访问。

调整后的代码示例

  1. 基类修改成员修饰符
public class BaseClass
{
    // 将原public替换为protected
    protected int m_a;
}
  1. 派生类内部访问正常生效
public class DerivedClass : BaseClass
{
    public void TestInnerAccess()
    {
        base.m_a = 10; // 编译正常,符合预期
    }
}
  1. 派生类实例外部访问被禁止
DerivedClass dc = new DerivedClass();
dc.m_a = 20; // 编译报错:CS0122 “BaseClass.m_a”不可访问,因为它受保护级别限制,完全符合禁用要求

特殊场景适配:无法修改基类代码的情况

如果你使用的基类来自第三方库,无法修改其public成员的修饰符,可以用组合替代继承的方式实现同等控制效果:

public class DerivedClass
{
    // 将基类作为私有内嵌成员,不对外暴露
    private readonly BaseClass _baseInstance = new BaseClass();

    public void TestInnerAccess()
    {
        _baseInstance.m_a = 10; // 内部访问正常
    }

    // 如果需要对外暴露基类的其他功能,手动封装对应的方法即可
    public void PublicMethodFromBase()
    {
        _baseInstance.SomePublicMethod();
    }
}

这种方案下,外部同样无法通过派生类实例直接访问到基类的m_a成员。

补充说明

如果你强制要求基类成员必须保留public修饰符,该需求无法实现:因为public的语义就是允许所有上下文通过实例访问,和你要的实例访问限制本质冲突。

内容的提问来源于stack exchange,提问作者kaernk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:09:02