0

メソッドがオーバーロードされたクラスがあります。

   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 メソッド (2 番目のメソッドを呼び出す) のすべてのロジックを回避したいと考えています。このメソッドだけなら大丈夫ですが、この状況は他の多くのオーバーロードされたメソッドで再現されます。

クラスは抽象的でインスタンス化できないため、メソッド isSameDay(date) はエラーを報告します...そして実際にはすべてのメソッドにロジックを持たせたくありません。クラスが巨大になり、作成が難しくなります。維持。誰でもこれを行う良い方法がありますか? 前もって感謝します。

4

4 に答える 4

4

抽象クラスのインスタンス化を必要とするロジックを削除します。上記の例では、定義したメソッドの役割を逆にすることで効果的にこれを行うことができます。

boolean isSameDay(Date date) {
    if (...) {
        return true;
    } else {
        return false;
    } 
}


boolean isSameDay(MyCal cal) {
    if(cal == null) return false;
    return (isSameDay(cal.getTime()));
}

必要に応じて他の方法に拡張してください。

于 2012-05-23T13:58:20.450 に答える
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);
    }
}
于 2012-05-23T13:58:59.837 に答える
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構文の間違いの可能性を許してください....

于 2012-05-23T14:24:21.507 に答える
1

あなたが何を求めているのかを伝えるのは本当に難しいですが、私は推測します...

このクラスを抽象化したいが、それでもインスタンス化する場合はできません (抽象クラスをインスタンス化することはできません) が、次のようにすることができます。

public abstract class MyCal ... {
    ...
    abstract String toString(String pattern);
}

public class MyCalBasic extends MyCal {
    String toString(String pattern) {
        // some vanilla impl
    }
}

クラスの「バニラ」バージョンが必要な場合は、MyCalBasic代わりに使用してください。MyCal

于 2012-05-23T13:59:16.787 に答える