繁体   English   中英

Java-具有重载方法的抽象类互相调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM