我有一个事件,如果“windowok”== false,它会引发异常。这就是我构建事件的方式:
public class GreenhouseControls extends Controller {
public class WindowMalfunction extends Event {
private Boolean windowok = false;
private void set(Boolean windowok) {
this.windowok = windowok ;
}
public WindowMalfunction(long delayTime) {
super(delayTime);
}
public void action() throws ControllerException {
if (!windowok) {
throw new ControllerException("Window Malfunction", 1);
}
}
public String toString() {
return "Windok OK = " + windowok;
}
}
}
该异常在另一个名为Controller的类中被捕获,如下所示:
public class Controller {
private List<Event> eventList = new ArrayList<Event>();
private Long wait;
public void addEvent(Event c) {
eventList.add(c);
}
public void shutdown(Long wait) {
this.wait = wait;
}
public void run() {
while(eventList.size() > 0)
for(Event e : new ArrayList<Event>(eventList))
if(e.ready()) {
System.out.println(e);
try {
e.action();
}
catch(ControllerException ex) {
shutdown(); // WHAT DO I DO HERE?
}
eventList.remove(e);
}
}
我需要在Controller类中启动shutdown()方法来终止程序,但是我需要覆盖GreenhouseControls类中的shutdown()方法来实现这一点。我应该在GreenhouseControls类中重写这个方法,我应该在catch块中调用shutdown()方法,还是只启动一个将在GreenhouseControls类中调用重写方法的进程?
答案 0 :(得分:1)
我只需在shutdown
类中声明一个抽象方法Controller
,该方法将由GreenhouseControls
实现。
我不知道您的架构的细节,但是,如果有多个其他类扩展它,那么有一个抽象类Controller
(无法实例化)可能会很好。我认为对于每种类型的控制器,关闭过程将是不同的,然后,通过使其抽象,您强制谁扩展Controller
以实现自定义关闭过程。相反,如果关闭过程始终相同,则可以直接在Controller
中实现。最后,如果某些预备程序对于所有类型的控制器都是通用的,则可以在shutdown()
内部Controller
类中实现它们,并通过调用super.shutdown();
作为第一步来覆盖派生类中的方法。 / p>