【发布时间】:2018-04-19 17:39:14
【问题描述】:
我正在编写一个程序,它需要对抽象对象Assignment 的子类进行 CRUD 操作。我有工厂来执行 CRUD 操作,但我在覆盖这些方法时遇到了问题。
public abstract class Assignment {
protected Integer id = null;
protected String name = null;
public Assignment() {}
public Assignment(Assignment original) { // code here to clone }
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
一个具体的任务
public class DCONAssignment extends Assignment {
protected Integer amount = null;
protected String type = null;
public DCONAssignment() {}
public DCONAssignment(DCONAssignment original) { // code here to clone }
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
抽象工厂
public abstract class AssignmentProcessor {
public abstract Assignment loadAssignment(Integer assignmentId);
// public abstract boolean saveAssignment(Assignment assignment); // option 1
// public abstract boolean saveAssignment(<? extends Assignment> assignment); // option 2 // This says "abstract methods do not specify a body"
// public <T extends Assignment> boolean saveAssignment(T assignment) { //option 3
public boolean saveAssignment(Assignment assignment) { //option 4
return false;
}
protected Assignment loadAssignment(Integer assignmentId, Class<? extends Assignment> clazz) {
Assignment assignment = null;
try {
assignment = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
BurstAssignment burstAssignment = null; // load assignmnet from db
assignment.setId(burstAssignment.getId());
return assignment;
}
}
混凝土工厂
public class DCONAssignmentProcessor extends AssignmentProcessor {
@Override
public DCONAssignment loadAssignment(Integer assignmentId) {
DCONAssignment assignment = (DCONAssignment) loadAssignment(assignmentId, DCONAssignment.class);
return assignment;
}
@Override
public boolean saveAssignment(DCONAssignment assignment) { // eclipse says I need to override a method with options 1, 3 and 4
return false;
}
}
总之,抽象工厂处理了一些加载作业的繁重工作。具体工厂处理它们特定的分配类实现的细节。问题是用具体参数覆盖抽象方法。那么问题来了,如何在抽象工厂中指定一个方法,并在具体工厂中用具体参数覆盖它呢?
【问题讨论】:
标签: java subclassing abstract-factory