如何在工厂子类中使用子类重写超类工厂中的抽象类?
解决抽象类Assignment子类CRUD工厂模式重写方法问题
我正在给抽象类Assignment的子类实现CRUD操作,打算用工厂模式来封装这些功能,但在子类重写CRUD相关方法的时候碰到了问题。目前我的抽象类代码如下:
public abstract class Assignment { protected Integer id = null; protected String name = null; public Assignment() {} public Assignment(Assignment original) { // 此处为克隆代码 } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { // 原内容此处截断 } }
结合你的场景,我整理了几个常见的重写问题及对应的解决思路:
一、常见的重写问题原因
从你的代码和描述来看,大概率碰到下面几种情况:
- 子类重写CRUD方法时方法签名不匹配(参数类型、数量或返回值和父类/工厂接口不一致),导致没有触发真正的重写
- 如果
Assignment或工厂接口定义了抽象CRUD方法,子类没有完全实现所有抽象方法 - 工厂模式中处理子类实例时出现类型转换错误,或者工厂方法没有正确实例化子类对象
- 拷贝构造函数的逻辑不完善,子类克隆时没有复制自身特有的属性,影响CRUD中的复制操作
二、针对性解决方案
1. 严格匹配重写方法的签名
重写方法时必须保证方法名、参数列表、返回值类型和父类/接口完全一致(Java 5及以上支持协变返回类型,比如父类返回Assignment,子类可以返回具体的子类类型)。
举个例子,如果你的工厂接口定义了CRUD方法:
public interface AssignmentCrudFactory { Assignment create(String name); void update(Assignment assignment); void delete(Integer id); Assignment getById(Integer id); }
那么子类的实现要严格对应:
public class SubAssignmentFactory implements AssignmentCrudFactory { @Override public SubAssignment create(String name) { // 协变返回是合法的 SubAssignment sub = new SubAssignment(); sub.setName(name); return sub; } @Override public void update(Assignment assignment) { // 先校验类型,避免类型转换异常 if (assignment instanceof SubAssignment) { SubAssignment sub = (SubAssignment) assignment; // 执行SubAssignment特有的更新逻辑,比如更新子类专属属性 } } // 其他delete、getById方法同理实现 }
2. 完善抽象类的CRUD抽象方法(可选)
如果希望Assignment的所有子类都实现CRUD逻辑,可以在抽象类中定义抽象方法,强制子类实现:
public abstract class Assignment { // 已有属性和方法... // 定义抽象CRUD方法 public abstract void save(); public abstract void update(); public abstract void delete(); public static abstract Assignment findById(Integer id); }
然后子类实现这些方法:
public class SubAssignment extends Assignment { // 子类专属属性 private String subDetail; @Override public void save() { // 实现SubAssignment的保存逻辑,比如插入数据库 } @Override public void update() { // 实现SubAssignment的更新逻辑 } // 其他delete、findById方法同理 }
3. 工厂模式中正确处理子类实例化
如果你的工厂是用来创建不同子类的Assignment对象,可以通过泛型来确保类型安全,同时在CRUD操作中识别子类类型:
public class AssignmentFactory { // 泛型方法创建子类实例 public static <T extends Assignment> T createInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException { return clazz.newInstance(); } // 统一处理更新逻辑 public static void updateAssignment(Assignment assignment) { if (assignment instanceof SubAssignment) { handleSubAssignmentUpdate((SubAssignment) assignment); } else if (assignment instanceof AnotherAssignment) { handleAnotherAssignmentUpdate((AnotherAssignment) assignment); } } private static void handleSubAssignmentUpdate(SubAssignment sub) { // 专门处理SubAssignment的更新逻辑 } private static void handleAnotherAssignmentUpdate(AnotherAssignment another) { // 专门处理AnotherAssignment的更新逻辑 } }
4. 完善子类的拷贝构造逻辑
你的Assignment有一个拷贝构造函数,子类必须实现自己的拷贝构造,才能正确复制子类的专属属性:
public class SubAssignment extends Assignment { private String subProperty; // 子类的拷贝构造函数 public SubAssignment(SubAssignment original) { super(original); // 先调用父类的拷贝构造,复制父类属性 this.subProperty = original.subProperty; // 复制子类专属属性 } // 可选:重写clone方法配合拷贝构造 @Override public Assignment clone() { return new SubAssignment(this); } }
内容的提问来源于stack exchange,提问作者bcr666
相关产品推荐
相关产品推荐

