使用 abstract 有助于 getSavedEvents() 方法,因为所有孩子都实现了该方法。
这是 setEvent() 的代码:
public class EventTable {
public void setEvent(Event e) {
int x = 0;
int type = e.getEventType();
columns = e.getFields();
Event[] savedEvents = e.getSavedEvents();
for(Event ev : savedEvents) {
tempdata[x][0] = ev.getFormattedDate()[0];
switch(type) {
case EVENTTYPE.WEIGHT:
tempdata[x][1] = ev.getWeight();
tempdata[x][2] = ev.getReps();
break;
case EVENTTYPE.TIMED:
tempdata[x][1] = ev.getTimeInHMS();
break;
case EVENTTYPE.REP:
tempdata[x][1] = ev.getReps();
break;
}
x++;
}
}
}
在我将“抽象”添加到 Event 类并定义了一个名为 getSavedEvents() 的抽象方法之后,此代码可以工作。
下一个问题是 getWeight()、getReps() 和 getTimeInHMS() 方法。它们特定于子事件的类型,并且在父事件类中也不存在。如果我在 Event 中将它们抽象化,现在我必须在每个子元素中定义它们,即使 getReps() 没有 TimedEvent 的上下文。
public class Event {
public Date getDate() { return(_date); }
}
public class WeightEvent extends Event {
public int getWeight() { return(_weight); }
public int getReps() { return(_reps); }
}
public class TimedEvent extends Event {
public String getTimeInHMS() { return(_timeString); }
}
public class RepEvent extends Event {
public int getReps() { return(_reps); }
}
显然,缩写代码。WeightEvents 具有与之关联的日期、重量和次数。TimedEvents 具有与之关联的日期和时间长度。RepEvents 具有与其关联的代表日期和数量。日期方法都在父级中,因为它们在事件中是通用的。
如果我不将 getWeight()、getReps() 抽象化,并且只在相关的子项中声明它们,那么这是我在上面复制的 setEvent() 方法中从 EventTable 得到的错误:
EventTable.java:124: cannot find symbol
symbol : method getWeight()
location: class Event
tempdata[x][1] = ev.getWeight();
-约翰