无法修改抽象类时,如何提取其子类抽象方法的通用实现?
解决方案:用中间抽象类统一封装类型转换逻辑
这确实是个典型的重复代码问题,核心原因是父类方法的参数类型是更宽泛的BaseInterface,但你的所有子类实际都只针对CastTheBaseInterface做业务逻辑,所以每次都得手动强转——完全没必要重复这个操作!我们可以通过新增一层中间抽象类来彻底解决这个问题,把类型转换逻辑统一封装起来,子类只需要专注业务就行。
具体实现步骤:
- 创建中间抽象类,继承原抽象类,在其中实现父类的抽象方法,专门处理类型转换:
// 原抽象类(无法修改) public abstract class OriginalAbstractClass { public abstract void do(Data someData, BaseInterface baseInterface); } // 新增的中间抽象类 public abstract class CastTheBaseInterfaceWrapper extends OriginalAbstractClass { @Override public final void do(Data someData, BaseInterface baseInterface) { // 在这里统一完成类型转换,所有子类共享这个逻辑 CastTheBaseInterface castedObj = (CastTheBaseInterface) baseInterface; // 调用子类需要实现的、基于转换后类型的方法 executeWithCastedInstance(someData, castedObj); } // 定义新的抽象方法,参数直接是转换后的类型,子类只需实现这个方法 protected abstract void executeWithCastedInstance(Data someData, CastTheBaseInterface castedInterface); }
- 子类继承中间抽象类,直接实现新的抽象方法,不用再写类型转换:
public class ConcreteSubClass1 extends CastTheBaseInterfaceWrapper { @Override protected void executeWithCastedInstance(Data someData, CastTheBaseInterface castedInterface) { castedInterface.exec(someData); // 这里可以添加子类独有的业务逻辑,无需重复转换 } } public class ConcreteSubClass2 extends CastTheBaseInterfaceWrapper { @Override protected void executeWithCastedInstance(Data someData, CastTheBaseInterface castedInterface) { castedInterface.exec(someData); // 另一个子类的自定义逻辑 } }
方案优势:
- 符合DRY原则:把重复的类型转换逻辑集中在中间类,避免子类重复代码
- 降低维护成本:如果后续类型转换逻辑需要调整(比如加校验),只需要修改中间类一处即可
- 增强类型安全性:可以在中间类的
do方法里提前加类型检查,避免运行时模糊的ClassCastException:@Override public final void do(Data someData, BaseInterface baseInterface) { if (!(baseInterface instanceof CastTheBaseInterface)) { throw new IllegalArgumentException("参数必须是CastTheBaseInterface类型,实际传入:" + baseInterface.getClass().getName()); } CastTheBaseInterface castedObj = (CastTheBaseInterface) baseInterface; executeWithCastedInstance(someData, castedObj); } - 避免子类误操作:用
final修饰中间类的do方法,防止子类意外重写破坏统一的转换逻辑
内容的提问来源于stack exchange,提问作者Crosk Cool
相关产品推荐
相关产品推荐

