C# | 为接口对象分配新类的技术咨询
关于C#中接口对象动态分配类的实现解析
嘿,看起来你正在用策略模式来实现对象行为的动态切换,这在C#里是个非常实用的设计思路!我来帮你拆解下代码里的关键点,以及怎么更好地搞定接口对象的分配和替换~
现有代码的核心逻辑
你的代码已经搭建好了策略模式的基础框架:
ObjectBehavior是定义行为规范的接口,所有具体行为类都要实现它的DoIt()方法BaseOfA作为基类,持有一个ObjectBehavior类型的成员,通过DoIt()转发行为逻辑,同时提供SetBehavior()方法来动态替换行为A类继承自BaseOfA,在构造时默认把行为初始化为BehaviorA
运行你的代码时,第一次调用obj1.DoIt()会执行BehaviorA的逻辑,调用SetBehavior(new BehaviorB())后,再次调用obj1.DoIt()就会切换成BehaviorB的逻辑,这正是策略模式的核心价值——动态改变对象的行为,无需修改对象本身的代码。
代码里需要调整的细节
我注意到代码里有几个小问题,调整后就能正常运行啦:
- 方法名不匹配:你调用了
obj1.SetFlyBehavior(new BehaviorB()),但BaseOfA里定义的是SetBehavior方法,这里改成obj1.SetBehavior(new BehaviorB())才能编译通过 - 缺失具体行为实现:
BehaviorA和BehaviorB需要具体实现ObjectBehavior接口,比如:
class BehaviorA : ObjectBehavior { public void DoIt() { Console.WriteLine("执行行为A的逻辑"); } } class BehaviorB : ObjectBehavior { public void DoIt() { Console.WriteLine("执行行为B的逻辑"); } }
- 空引用防护:为了避免
behavior为null时调用DoIt()抛出异常,可以给BaseOfA的方法加个空检查:
public void DoIt() { behavior?.DoIt(); // 使用空条件运算符,安全调用 } public void SetBehavior(ObjectBehavior ob) { if (ob == null) throw new ArgumentNullException(nameof(ob), "行为实例不能为null"); behavior = ob; }
优化后的完整代码
把这些调整整合后,完整的可运行代码如下:
class Program { static void Main(string[] args) { var obj1 = new A(); obj1.DoIt(); // 输出:执行行为A的逻辑 obj1.SetBehavior(new BehaviorB()); obj1.DoIt(); // 输出:执行行为B的逻辑 Console.ReadLine(); } }; class BaseOfA { protected ObjectBehavior behavior; public void DoIt() { behavior?.DoIt(); } public void SetBehavior(ObjectBehavior ob) { if (ob == null) throw new ArgumentNullException(nameof(ob), "行为实例不能为null"); behavior = ob; } }; class A : BaseOfA { public A() { behavior = new BehaviorA(); } } interface ObjectBehavior { void DoIt(); } class BehaviorA : ObjectBehavior { public void DoIt() { Console.WriteLine("执行行为A的逻辑"); } } class BehaviorB : ObjectBehavior { public void DoIt() { Console.WriteLine("执行行为B的逻辑"); } }
这种模式的优势
这种通过接口封装行为、动态替换的方式完美符合开闭原则:当你需要新增一种行为时,只需要创建一个新的ObjectBehavior实现类,不需要修改BaseOfA或A的代码,扩展性拉满~
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

