C#中如何为Calculator类的不同实例限制可访问的成员方法
C# 实现Calculator实例方法访问限制的方案
核心逻辑
通过接口隔离原则拆分不同权限的访问范围,不需要修改原有方法的内部实现,仅通过类型约束即可实现不同实例的方法访问限制。
方案1:接口隔离(最优实现)
1. 定义分层权限接口
// 仅包含2参数相加权限 public interface IAddition2Params { int Addition(int a, int b); } // 包含2、3参数相加权限,继承上一级接口 public interface IAddition3Params : IAddition2Params { int Addition2(int a, int b, int c); } // 包含所有参数相加权限,继承上一级接口 public interface IAddition4Params : IAddition3Params { int Addition3(int a, int b, int c, int d); }
2. 让原有Calculator类实现上述接口
原有方法不需要做任何逻辑修改,仅需要补充接口继承声明:
public class Calculator : IAddition2Params, IAddition3Params, IAddition4Params { public int Addition(int a, int b) { /* 原有逻辑 */ return a + b; } public int Addition2(int a, int b, int c) { /* 原有逻辑 */ return a + b + c; } public int Addition3(int a, int b,int c, int d) { /* 原有逻辑 */ return a + b + c + d; } }
3. 按权限声明实例
在Main方法中用对应权限的接口类型接收实例,即可自动限制可访问的方法:
// 仅可访问2参数Addition方法 IAddition2Params obj1 = new Calculator(); obj1.Addition(1, 2); // 正常调用 // obj1.Addition2(1,2,3); 编译报错,无访问权限 // 可访问2参数、3参数相加方法 IAddition3Params obj2 = new Calculator(); obj2.Addition(1, 2); // 正常调用 obj2.Addition2(1, 2, 3); // 正常调用 // obj2.Addition3(1,2,3,4); 编译报错,无访问权限 // 可访问所有相加方法 IAddition4Params obj3 = new Calculator(); obj3.Addition(1, 2); obj3.Addition2(1, 2, 3); obj3.Addition3(1, 2, 3, 4); // 所有方法均可正常调用
方案2:包装类封装(无需修改原Calculator类)
如果无法修改原有Calculator的代码,可以通过包装类封装权限,不需要改动原有类:
// 仅开放2参数相加的包装类 public class LimitedCalc1 { private readonly Calculator _calc = new Calculator(); public int Addition(int a, int b) => _calc.Addition(a, b); } // 开放2、3参数相加的包装类 public class LimitedCalc2 { private readonly Calculator _calc = new Calculator(); public int Addition(int a, int b) => _calc.Addition(a, b); public int Addition2(int a, int b, int c) => _calc.Addition2(a, b, c); }
实例化时直接创建对应包装类的对象即可:
var obj1 = new LimitedCalc1(); var obj2 = new LimitedCalc2();
内容的提问来源于stack exchange,提问作者Shalini Raj
相关产品推荐
相关产品推荐

