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

时间:2012-05-23 13:48:14

标签: java overloading abstract

我有一个重载方法的类。

   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)将报告错误...并且实际上不希望在所有方法上都有逻辑,它会使类很大更难维护。 任何人都可以有一个很好的方法吗? 先感谢您。

4 个答案:

答案 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

相关问题