![](/img/trans.png)
[英]Is it possible to overload abstract methods in an abstract Java class, but implement only one of the overloaded methods in subclass?
[英]Java - Abstract class with overloaded methods calling each other
我有一个带有重载方法的类。
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)方法将报告一个错误...并且确实不希望所有方法都具有逻辑,这将使该类庞大且难于执行保持。 有人能做到这一点吗? 先感谢您。
删除需要实例化抽象类的逻辑。 在上面的示例中,您可以通过反转定义的方法的角色来有效地做到这一点:
boolean isSameDay(Date date) {
if (...) {
return true;
} else {
return false;
}
}
boolean isSameDay(MyCal cal) {
if(cal == null) return false;
return (isSameDay(cal.getTime()));
}
根据需要扩展到其他方法。
您可以定义一个方法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);
}
}
我认为他的意思是他想实例化父类中派生类的对象。
我建议做这样的事情:
家长班
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语法错误....
很难说出您的要求,但我会猜测...
如果要使此类抽象,但仍要实例化,则不能(不能实例化抽象类),但是可以这样做:
public abstract class MyCal ... {
...
abstract String toString(String pattern);
}
public class MyCalBasic extends MyCal {
String toString(String pattern) {
// some vanilla impl
}
}
当您需要类的“香草”版本时,只需使用MyCalBasic
而不是MyCal
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.