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

如何合并仅同步/异步方法差异的类,消除重复且不暴露冗余方法?

解决方案

方案1:显式接口分离同步/异步逻辑

定义两个独立接口分别对应同步和异步操作,基类通过显式接口实现隐藏不需要的方法,派生类只需实现对应接口的逻辑,用户使用时只会看到对应类型的方法:

// 基类所在程序集
public interface ISyncEvaluator
{
    object? Evaluate();
}

public interface IAsyncEvaluator
{
    Task<object?> EvaluateAsync();
}

public abstract class A : ISyncEvaluator, IAsyncEvaluator
{
    // 显式实现接口,默认抛出未实现异常(或编写通用基础逻辑)
    object? ISyncEvaluator.Evaluate()
    {
        throw new NotImplementedException("请在同步派生类中实现此方法");
    }

    Task<object?> IAsyncEvaluator.EvaluateAsync()
    {
        throw new NotImplementedException("请在异步派生类中实现此方法");
    }

    // 所有通用逻辑放在这里,比如参数校验、结果处理
    protected object? ProcessResult(object? rawResult)
    {
        // 通用处理逻辑示例
        return rawResult;
    }
}

// 同步派生类B所在程序集
public class B : A, ISyncEvaluator
{
    public new object? Evaluate()
    {
        var rawResult = GetSyncData();
        return base.ProcessResult(rawResult);
    }

    private object? GetSyncData()
    {
        // 同步业务逻辑
        return null;
    }
}

// 异步派生类C所在程序集
public class C : A, IAsyncEvaluator
{
    public new async Task<object?> EvaluateAsync()
    {
        var rawResult = await GetAsyncData();
        return base.ProcessResult(rawResult);
    }

    private Task<object?> GetAsyncData()
    {
        // 异步业务逻辑
        return Task.FromResult<object?>(null);
    }
}

方案2:泛型基类+策略模式

把同步/异步的差异封装成策略类,基类通过泛型约束限定策略类型,对外只暴露统一的调用入口,用户无需区分同步异步:

// 基类所在程序集
public interface IEvaluationStrategy
{
    Task<object?> ExecuteAsync();
}

// 同步策略:将同步逻辑包装为Task
public class SyncEvaluationStrategy : IEvaluationStrategy
{
    private readonly Func<object?> _syncFunc;

    public SyncEvaluationStrategy(Func<object?> syncFunc)
    {
        _syncFunc = syncFunc;
    }

    public Task<object?> ExecuteAsync()
    {
        return Task.FromResult(_syncFunc());
    }
}

// 异步策略
public class AsyncEvaluationStrategy : IEvaluationStrategy
{
    private readonly Func<Task<object?>> _asyncFunc;

    public AsyncEvaluationStrategy(Func<Task<object?>> asyncFunc)
    {
        _asyncFunc = asyncFunc;
    }

    public Task<object?> ExecuteAsync()
    {
        return _asyncFunc();
    }
}

public abstract class A<T> where T : IEvaluationStrategy
{
    protected readonly T _strategy;

    protected A(T strategy)
    {
        _strategy = strategy;
    }

    // 统一对外暴露异步入口
    public async Task<object?> EvaluateAsync()
    {
        // 通用校验逻辑
        Validate();
        var rawResult = await _strategy.ExecuteAsync();
        // 通用结果处理
        return ProcessResult(rawResult);
    }

    protected void Validate()
    {
        // 通用校验逻辑示例
    }

    protected object? ProcessResult(object? rawResult)
    {
        // 通用处理逻辑示例
        return rawResult;
    }
}

// 同步派生类B所在程序集
public class B : A<SyncEvaluationStrategy>
{
    public B() : base(new SyncEvaluationStrategy(GetSyncData))
    {
    }

    private static object? GetSyncData()
    {
        // 同步业务逻辑
        return null;
    }
}

// 异步派生类C所在程序集
public class C : A<AsyncEvaluationStrategy>
{
    public C() : base(new AsyncEvaluationStrategy(GetAsyncData))
    {
    }

    private static Task<object?> GetAsyncData()
    {
        // 异步业务逻辑
        return Task.FromResult<object?>(null);
    }
}

方案3:基类仅保留受保护核心逻辑,派生类按需暴露方法

基类只定义受保护的通用逻辑,派生类根据自身特性公开对应的公共方法,完全避免用户看到冗余方法:

// 基类所在程序集
public abstract class A
{
    // 受保护的同步核心逻辑
    protected object? CoreLogic()
    {
        // 通用核心逻辑示例
        return null;
    }

    // 受保护的异步核心逻辑(如果有独立异步通用逻辑可单独实现)
    protected Task<object?> CoreLogicAsync()
    {
        return Task.FromResult(CoreLogic());
    }
}

// 同步派生类B所在程序集
public class B : A
{
    public object? Evaluate()
    {
        return base.CoreLogic();
    }
}

// 异步派生类C所在程序集
public class C : A
{
    public async Task<object?> EvaluateAsync()
    {
        return await base.CoreLogicAsync();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:48:19