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

C#中能否将分部类关联至多个类?重复逻辑复用方案咨询

分部类不可行,附3种可行的重构方案

分部类在这里完全不适用——它的作用是把同一个类的代码拆分到多个文件,本质还是同一个类型。而你的ImplStep1和ImplStep2是两个独立的类,分别继承不同的抽象类,分部类解决不了跨类的逻辑复用问题。

下面是针对你场景的3种实用重构方案:


方案1:提取公共逻辑到辅助类

不用修改现有抽象类结构,把重复的逻辑封装成静态辅助方法,让两个实现类直接调用即可。

辅助类代码

public static class StepStatusHelper
{
    // 封装公共的Completed逻辑,传入事件实例用于触发
    public static bool ExecuteCompletedLogic(EventHandler stepCompletedEvent)
    {
        // 这里放原本的公共逻辑代码
        // ...

        // 触发StepCompleted事件
        stepCompletedEvent?.Invoke(null, EventArgs.Empty);
        return true;
    }

    // 封装公共的StatusUpdate逻辑
    public static void ExecuteStatusUpdateLogic(EventHandler statusUpdateEvent, string statusMessage)
    {
        // 这里放原本的公共逻辑代码
        // ...

        // 触发StatusUpdate事件
        statusUpdateEvent?.Invoke(null, EventArgs.Empty);
    }
}

实现类调用示例

public class ImplStep1 : Step1
{
    public event EventHandler StepCompleted;
    public event EventHandler StatusUpdate;

    private bool Completed()
    {
        return StepStatusHelper.ExecuteCompletedLogic(StepCompleted);
    }

    private void StatusUpdate(string statusMessage)
    {
        StepStatusHelper.ExecuteStatusUpdateLogic(StatusUpdate, statusMessage);
    }

    // 类独有的内容
}

ImplStep2直接复用上述调用逻辑即可。


方案2:用组合模式封装公共逻辑

创建一个实现IStepStatus的公共处理类,把所有接口相关的公共逻辑和事件都封装在这里,实现类通过持有该类的实例来复用逻辑。

公共处理类代码

public class StepStatusHandler : IStepStatus
{
    public event EventHandler StepCompleted;
    public event EventHandler StatusUpdate;
    public event PropertyChangedEventHandler PropertyChanged;

    public bool Completed()
    {
        // 公共逻辑代码
        // ...
        StepCompleted?.Invoke(null, EventArgs.Empty);
        return true;
    }

    public void UpdateStatus(string statusMessage)
    {
        // 公共逻辑代码
        // ...
        StatusUpdate?.Invoke(null, EventArgs.Empty);
        // 若需要触发INotifyPropertyChanged,逻辑也放在这里
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(...)));
    }
}

实现类委托示例

public class ImplStep1 : Step1
{
    private readonly StepStatusHandler _statusHandler = new StepStatusHandler();

    // 把接口事件委托给_statusHandler
    public event EventHandler StepCompleted
    {
        add => _statusHandler.StepCompleted += value;
        remove => _statusHandler.StepCompleted -= value;
    }

    public event EventHandler StatusUpdate
    {
        add => _statusHandler.StatusUpdate += value;
        remove => _statusHandler.StatusUpdate -= value;
    }

    public event PropertyChangedEventHandler PropertyChanged
    {
        add => _statusHandler.PropertyChanged += value;
        remove => _statusHandler.PropertyChanged -= value;
    }

    private bool Completed()
    {
        return _statusHandler.Completed();
    }

    private void StatusUpdate(string statusMessage)
    {
        _statusHandler.UpdateStatus(statusMessage);
    }

    // 类独有的内容
}

这个方案能彻底隔离公共逻辑,后续修改只需要改StepStatusHandler即可。


方案3:调整抽象类继承结构(需修改原有抽象类)

如果允许修改Step1和Step2的代码,可以让它们继承一个共同的基类,把公共逻辑放在基类中实现。

调整后的抽象类结构

// 新增公共基类,实现IStepStatus的公共逻辑
public abstract class BaseStep : IStepStatus
{
    public event EventHandler StepCompleted;
    public event EventHandler StatusUpdate;
    public event PropertyChangedEventHandler PropertyChanged;

    protected bool Completed()
    {
        // 公共逻辑代码
        // ...
        StepCompleted?.Invoke(null, EventArgs.Empty);
        return true;
    }

    protected void UpdateStatus(string statusMessage)
    {
        // 公共逻辑代码
        // ...
        StatusUpdate?.Invoke(null, EventArgs.Empty);
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(...)));
    }
}

// 修改原有抽象类,继承BaseStep
public abstract class Step1 : BaseStep
{
    // 保留Step1独有的方法
}

public abstract class Step2 : BaseStep
{
    // 保留Step2独有的方法
}

简化后的实现类

public class ImplStep1 : Step1
{
    private bool Completed()
    {
        return base.Completed(); // 直接调用基类的公共逻辑
    }

    private void StatusUpdate(string statusMessage)
    {
        base.UpdateStatus(statusMessage);
    }

    // 类独有的内容
}

这个方案最简洁,但需要你有权修改Step1和Step2的继承关系。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:47:07