抽象类方法参数重写:如何允许子类替换默认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
相关产品推荐
相关产品推荐

