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

C# | 为接口对象分配新类的技术咨询

关于C#中接口对象动态分配类的实现解析

嘿,看起来你正在用策略模式来实现对象行为的动态切换,这在C#里是个非常实用的设计思路!我来帮你拆解下代码里的关键点,以及怎么更好地搞定接口对象的分配和替换~

现有代码的核心逻辑

你的代码已经搭建好了策略模式的基础框架:

  • ObjectBehavior是定义行为规范的接口,所有具体行为类都要实现它的DoIt()方法
  • BaseOfA作为基类,持有一个ObjectBehavior类型的成员,通过DoIt()转发行为逻辑,同时提供SetBehavior()方法来动态替换行为
  • A类继承自BaseOfA,在构造时默认把行为初始化为BehaviorA

运行你的代码时,第一次调用obj1.DoIt()会执行BehaviorA的逻辑,调用SetBehavior(new BehaviorB())后,再次调用obj1.DoIt()就会切换成BehaviorB的逻辑,这正是策略模式的核心价值——动态改变对象的行为,无需修改对象本身的代码。

代码里需要调整的细节

我注意到代码里有几个小问题,调整后就能正常运行啦:

  1. 方法名不匹配:你调用了obj1.SetFlyBehavior(new BehaviorB()),但BaseOfA里定义的是SetBehavior方法,这里改成obj1.SetBehavior(new BehaviorB())才能编译通过
  2. 缺失具体行为实现:BehaviorA和BehaviorB需要具体实现ObjectBehavior接口,比如:
class BehaviorA : ObjectBehavior {
    public void DoIt() {
        Console.WriteLine("执行行为A的逻辑");
    }
}

class BehaviorB : ObjectBehavior {
    public void DoIt() {
        Console.WriteLine("执行行为B的逻辑");
    }
}
  1. 空引用防护:为了避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:55:22