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

如何在C#中限制子类Admin访问父类Employee的Salary属性?

解决方案:实现Account与Admin的差异化属性访问

原来的代码中所有字段都设为public,导致继承链上的Admin类能访问Employee的全部成员,无法满足需求。要实现Account可访问全部三个属性、Admin仅能访问EmployeeId和EmployeeName,可以通过拆分基类的方式解决,这也是最符合C#继承设计原则的方案:

方案一:拆分基类(推荐)

通过拆分出一个包含公共属性的基类,让不同角色的类继承不同层级的基类,实现权限隔离:

// 公共基类:包含所有角色都可访问的属性
class BaseEmployee
{
    public int EmployeeId { get; set; } = 123;
    public string EmployeeName { get; set; } = "Ram";
}

// 继承公共基类,添加仅Account可访问的薪资属性
class Employee : BaseEmployee
{
    // protected修饰:仅当前类及直接子类可访问
    protected double Salary { get; set; } = 50000;
}

// Account继承Employee,可访问全部三个属性
class Account : Employee
{
    // 可以在类内部访问Salary,也可以提供方法对外暴露
    public void PrintSalary()
    {
        Console.WriteLine("EmployeeSalary= {0}", Salary);
    }
}

// Admin仅继承公共基类,只能访问Id和Name
class Admin : BaseEmployee
{
    // 尝试访问Salary会直接编译报错,无法通过
    // public void TryAccessSalary() => Console.WriteLine(Salary);
}

public class Demo
{
    public static void Main(string[] args)
    {
        Account ac = new Account();
        Console.WriteLine("EmployeeID= {0}", ac.EmployeeId);
        Console.WriteLine("EmployeeName= {0}", ac.EmployeeName);
        ac.PrintSalary(); // 通过Account类的方法访问薪资

        Admin ad = new Admin();
        Console.WriteLine("EmployeeID= {0}", ad.EmployeeId);
        Console.WriteLine("EmployeeName= {0}", ad.EmployeeName);

        // 以下代码编译报错,Admin无法访问Salary
        // Console.WriteLine("EmployeeSalary= {0}", ad.Salary);
    }
}

关键逻辑说明

  1. BaseEmployee作为公共基类,封装所有角色共享的EmployeeId和EmployeeName
  2. Employee继承BaseEmployee,添加protected修饰的Salary,确保只有直接子类Account能访问
  3. Admin直接继承BaseEmployee,自然无法访问Employee中定义的Salary

方案二:程序集隔离(可选)

如果允许将类拆分到不同程序集,可以通过protected internal修饰符实现:

  • 将Employee和Account放在同一个程序集,Salary设为protected internal
  • 将Admin放在另一个独立程序集
  • 此时同程序集的Account可访问Salary,跨程序集的Admin只能访问public的EmployeeId和EmployeeName

这种方式依赖程序集划分,灵活性不如方案一,仅适合多程序集的项目场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:47:20