我有一个重载方法的类。
public class MyCal extends GregorianCalendar {
//constructor
public MyCal(Date date) {
super();
setTime(date);
}
boolean isSameDay(Date date) {
return (isSameDay(new MyCal(date))) {
}
boolean isSameDay(MyCal cal) {
if (...) {
return true;
} else {
return false;
}
}
//abstract String toString(String pattern) {};
//if I have this I can't call new MyCal(date) from above
}
现在我希望类是抽象的(需要子类来实现一些其他方法),并且仍然避免第一个isSameDay方法的所有逻辑(调用第二个)。如果它只是这种方法,我可以做到这一点,但这种情况在许多其他重载方法上被复制。
抽象的类我无法实例化它,因此方法isSameDay(date)将报告错误...并且实际上不希望在所有方法上都有逻辑,它会使类很大更难维护。 任何人都可以有一个很好的方法吗? 先感谢您。
答案 0 :(得分:4)
删除需要实例化抽象类的逻辑。在上面的示例中,您可以通过反转您定义的方法的角色来有效地执行此操作:
boolean isSameDay(Date date) {
if (...) {
return true;
} else {
return false;
}
}
boolean isSameDay(MyCal cal) {
if(cal == null) return false;
return (isSameDay(cal.getTime()));
}
根据需要扩展到您的其他方法。
答案 1 :(得分:3)
您可以定义方法getMyCal(date)
public class MyCal extends GregorianCalendar {
abstract MyCal getMyCal(Date date);
// further implementation
}
而不是使用new MyCal(date)
,您可以在方法中使用getMyCal(date)
。
抽象类的实现只需要实现getMyCal方法。
public ConcreteCal extends MyCal {
MyCal getMyCal(Date date) {
return new ConcreteCal(date);
}
}
答案 2 :(得分:2)
我认为他的意思是他想在父类中实例化派生类的对象。
我建议做这样的事情:
父类
public class MyCal extends GregorianCalendar {
(...)
boolean isSameDay(Date date) {
return (isSameDay(newInstance())) {
}
abstract MyCal newInstance(){}
(...)
}
派生类
public class MyDerivedCal extends MyCal{
(...)
abstract MyCal newInstance(){
return new MyDerivedCal();
}
(...)
}
原谅我可能的java语法错误....
答案 3 :(得分:1)
很难说出你在问什么,但我会猜测......
如果你想让这个类抽象化,但仍然实例化它,你就不能(你不能实例化一个抽象类),但你可以这样做:
public abstract class MyCal ... {
...
abstract String toString(String pattern);
}
public class MyCalBasic extends MyCal {
String toString(String pattern) {
// some vanilla impl
}
}
如果您想要该类的“香草”版本,只需使用MyCalBasic
代替MyCal
。