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

C#中类与类无需通过对象引用即可实现通信的方法有哪些?

优化实现方案

你可以根据业务复杂度选择以下几种无属性引用的实现方式:

方案1:依赖作为方法参数传递

改动最小的轻量化方案,不需要在类中存储全局引用,仅在需要交互的方法调用时传入目标对象即可,适合简单的一对一调用场景。

class Encounter
{
    // 无需存储Shelter属性
    public void CapturePet(Shelter targetShelter)
    {
        targetShelter.AddPet(new Pet());
    }
}

// 调用侧写法
static void Main(string[] args)
{
    shelter = new Shelter() { pets = new List<Pet>() };
    encounter = new Encounter();
    // 调用时传入Shelter即可
    encounter.CapturePet(shelter);
}

方案2:事件驱动(观察者模式)

完全解耦的实现方案,Encounter仅负责发布「捕获宠物」的事件,Shelter作为订阅者自行处理添加逻辑,双方不需要持有对方的引用,新增其他订阅逻辑也不需要修改现有代码,适合一对多通知场景。

class Encounter
{
    // 定义捕获宠物事件,无需持有Shelter引用
    public event Action<Pet> OnPetCaptured;

    public void CapturePet()
    {
        OnPetCaptured?.Invoke(new Pet());
    }
}

// 调用侧只需要完成事件绑定即可
static void Main(string[] args)
{
    shelter = new Shelter() { pets = new List<Pet>() };
    encounter = new Encounter();
    // 绑定事件:捕获到宠物后自动添加到收容所
    encounter.OnPetCaptured += shelter.AddPet;
}

后续如果要新增成就统计、日志记录等响应捕获宠物的逻辑,只需要新增对应订阅即可,不需要修改Encounter和Shelter的现有代码。

方案3:中介者模式

适合多对象复杂交叉交互的场景,所有业务对象仅和中介者通信,不需要互相持有引用,所有交互逻辑统一收敛在中介者中维护,避免类之间出现大量杂乱的引用依赖。

// 中介者抽象接口
interface IGameMediator
{
    void NotifyPetCaptured(Pet pet);
}

// 具体中介者,统一维护所有交互逻辑
class GameMediator : IGameMediator
{
    public Shelter Shelter { get; set; }
    // 后续新增其他交互对象都在这里声明

    public void NotifyPetCaptured(Pet pet)
    {
        Shelter.AddPet(pet);
        // 其他交互逻辑都在这里统一处理,不需要修改业务类
    }
}

class Encounter
{
    private readonly IGameMediator _mediator;
    // 仅依赖中介者,不需要知道Shelter的存在
    public Encounter(IGameMediator mediator)
    {
        _mediator = mediator;
    }

    public void CapturePet()
    {
        _mediator.NotifyPetCaptured(new Pet());
    }
}

// 调用侧完成对象组装
static void Main(string[] args)
{
    var shelter = new Shelter() { pets = new List<Pet>() };
    var mediator = new GameMediator() { Shelter = shelter };
    var encounter = new Encounter(mediator);
}

选型建议

  • 交互逻辑简单、仅少量一对一调用:优先选方案1,改动最小最直观
  • 需要一对多通知、后续可能新增响应逻辑:优先选方案2,解耦程度最高
  • 多模块交叉交互复杂、引用关系杂乱:优先选方案3,统一维护交互逻辑

内容的提问来源于stack exchange,提问作者Davis Murphy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:57:04