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

抽象类方法参数重写:如何允许子类替换默认SortDto参数?

解决方案

当然可以实现这样的设计,既保留基于SortDto的默认逻辑,又允许子类根据需求替换参数类型甚至支持多参数。下面提供几种实用的方案:

方案1:方法重载 + 核心逻辑抽离

把判断结果的核心逻辑封装成私有方法,然后对外提供多个重载的setExitStatus方法。子类可以根据需要重写对应参数的重载方法,同时复用核心逻辑:

public abstract class BaseProcessor {

    // 封装核心判断逻辑,避免重复代码
    private String determineExitStatus(int totalPages) {
        return totalPages > 0 ? "DATOS" : "SINDATOS";
    }

    // 默认实现:接收SortDto参数
    protected String setExitStatus(SortDto sortDto) {
        return determineExitStatus(sortDto.getTotalNumberOfPages());
    }

    // 重载方法:支持其他DTO类型,子类可重写
    protected String setExitStatus(OtherDto otherDto) {
        throw new UnsupportedOperationException("请重写该方法以支持OtherDto类型");
    }

    // 重载方法:支持多参数场景,子类可重写
    protected String setExitStatus(FooDto fooDto, BarDto barDto) {
        throw new UnsupportedOperationException("请重写该方法以支持多参数场景");
    }
}

子类使用示例:

public class ConcreteProcessor extends BaseProcessor {

    @Override
    protected String setExitStatus(OtherDto otherDto) {
        // 从OtherDto中获取页数相关数据,调用核心逻辑
        return determineExitStatus(otherDto.getTotalPageCount());
    }

    @Override
    protected String setExitStatus(FooDto fooDto, BarDto barDto) {
        // 结合两个DTO的数据计算页数,调用核心逻辑
        int totalPages = fooDto.getPageNum() + barDto.getExtraPages();
        return determineExitStatus(totalPages);
    }
}

方案2:接口适配模式(更优雅的统一处理)

定义一个通用接口,抽象出核心判断需要的能力(比如获取总页数),让所有DTO通过适配器或者直接实现该接口,这样抽象类只需要处理统一的接口类型:

// 定义通用接口:抽象获取总页数的能力
public interface PageCountSource {
    int getTotalNumberOfPages();
}

// SortDto的适配器(如果SortDto无法修改实现接口)
public class SortDtoAdapter implements PageCountSource {
    private final SortDto sortDto;

    public SortDtoAdapter(SortDto sortDto) {
        this.sortDto = sortDto;
    }

    @Override
    public int getTotalNumberOfPages() {
        return sortDto.getTotalNumberOfPages();
    }
}

// 其他DTO的适配器
public class OtherDtoAdapter implements PageCountSource {
    private final OtherDto otherDto;

    public OtherDtoAdapter(OtherDto otherDto) {
        this.otherDto = otherDto;
    }

    @Override
    public int getTotalNumberOfPages() {
        return otherDto.getCalculatedTotalPages();
    }
}

// 抽象类中仅保留通用方法,同时兼容SortDto的直接调用
public abstract class BaseProcessor {

    protected String setExitStatus(PageCountSource source) {
        return source.getTotalNumberOfPages() > 0 ? "DATOS" : "SINDATOS";
    }

    // 保留原方法,方便直接传入SortDto
    protected String setExitStatus(SortDto sortDto) {
        return setExitStatus(new SortDtoAdapter(sortDto));
    }
}

子类使用时,只需要为自己的DTO实现适配器即可,核心逻辑完全复用,扩展性更强。

方案3:泛型抽象方法(灵活但需注意边界)

如果希望更灵活的参数类型,可以定义泛型抽象方法,同时保留默认的SortDto实现:

public abstract class BaseProcessor {

    private String determineExitStatus(int totalPages) {
        return totalPages > 0 ? "DATOS" : "SINDATOS";
    }

    // 默认SortDto实现
    protected String setExitStatus(SortDto sortDto) {
        return determineExitStatus(sortDto.getTotalNumberOfPages());
    }

    // 泛型方法:允许子类传入任意单个DTO
    protected abstract <T> String setExitStatus(T dto);

    // 泛型方法:支持多参数场景
    protected abstract <T, U> String setExitStatus(T dto1, U dto2);
}

这种方式适合参数类型完全不确定的场景,但子类必须实现所有抽象的泛型方法,灵活性稍弱。

内容的提问来源于stack exchange,提问作者Paco Pinazo Guna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:42:49