如何在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); } }
关键逻辑说明
BaseEmployee作为公共基类,封装所有角色共享的EmployeeId和EmployeeNameEmployee继承BaseEmployee,添加protected修饰的Salary,确保只有直接子类Account能访问Admin直接继承BaseEmployee,自然无法访问Employee中定义的Salary
方案二:程序集隔离(可选)
如果允许将类拆分到不同程序集,可以通过protected internal修饰符实现:
- 将
Employee和Account放在同一个程序集,Salary设为protected internal - 将
Admin放在另一个独立程序集 - 此时同程序集的
Account可访问Salary,跨程序集的Admin只能访问public的EmployeeId和EmployeeName
这种方式依赖程序集划分,灵活性不如方案一,仅适合多程序集的项目场景。
内容的提问来源于stack exchange,提问作者Sachin Deoli
相关产品推荐
相关产品推荐

