1

ご挨拶とご挨拶!

現在、抽象クラス A があり、多くのクラスがそれをサブクラス化しています。oneMethod() に入れたすべてのサブクラスに共通のコードと、2 つの抽象メソッドに入れた各実装に固有のコードです。

public abstract class AbstractA {
     public oneMethod() {
          //do some intelligent stuff here
          abstractMethodOne();
          abstractMethodTwo();
     }
     protected abstract void abstractMethodOne();
     protected abstract void abstractMethodTwo();
}

oneMethod() メソッドをオーバーライドするクラスがあります。

public class B extends AbstractA {
     @Override
     public oneMethod() {
          //do some other intelligent stuff here
     }
}

サブクラスの 2 つの抽象メソッドのスタブ実装をスキップする方法はありますか? つまり、それらが使用される唯一の場所は、オーバーライドされたメソッドです。

どんな助けでも大歓迎です!

4

7 に答える 7

5

いいえ。抽象クラスを拡張する場合は、子クラスを抽象化するか、親クラスの契約を満たす必要があります。

設計上の観察として、oneMethod() を final または abstract にすることをお勧めします。実装している方法で拡張できるプログラムを維持するのは困難です。他の抽象メソッドを使用して、子クラスに oneMethod() の機能へのフックを提供します。

于 2013-08-21T15:03:53.170 に答える
2

スーパークラスにプルoneMethodアップできます:

public abstract class AbstractC {
  public void oneMethod() {
  }
}

public abstract class AbstractA extends AbstractC {
  @Override
  public void oneMethod() {
    //do some intelligent stuff here
    abstractMethodOne();
    abstractMethodTwo();
  }

  protected abstract void abstractMethodOne();

  protected abstract void abstractMethodTwo();

}

public class B extends AbstractC {
  @Override
  public void oneMethod() {
    //do some other intelligent stuff here
  }
}

必要以上のものを必要としない方法を今見てくださいAbstractC

于 2013-08-21T15:09:24.240 に答える
2

すべての抽象メソッドに実装を提供する必要があります。プログラムのどの部分もそれらを呼び出していなくても、将来それらを呼び出すクラスが作成されるか、スーパークラスの実装が変更される可能性があります。バイナリ互換性のためだけであっても、スタブが必要です。

于 2013-08-21T15:02:51.123 に答える
1

クラスBも抽象化するだけです。

public abstract class B extends AbstractA {
于 2013-08-21T15:10:38.637 に答える
1

abstractMethodOne()とは実装固有ですが、常にそれらを呼び出すことがわかっているため abstractMethodTwo()、次のような構成を使用できます。

public interface SomeInterface {
    void abstractMethodOne();
    void abstractMethodTwo();
}

次のようなクラスを作成します。

public class SomeClass {
    public void executeThem(SomeInterface onSomeObject) {
        onSomeObject.abstractMethodOne();
        onSomeObject.abstractMethodTwo();
    }
}

次に、これらのメソッドを次のように呼び出す必要がある任意のクラスでこれを構成できます。

public class SomeImplementation implements SomeInterface {

    public void abstractMethodOne() {
        // ...
    }
    public void abstractMethodTwo() {
        // ...
    }

    public void executeThem() {
        new SomeClass().executeThem(this);
    }
}

このようにして、継承を完全に取り除き、クラスをより柔軟に実装できますSomeInterface

于 2013-08-21T15:14:11.260 に答える
0

では、abstractMethodTwoabstractMethodOneが実装固有である場合、なぜこれらのメソッドを基本抽象クラスに入れるのでしょうか? おそらく、共通のインターフェースまたは特定のデザインパターンがあなたが探しているものです!

于 2013-08-21T15:04:57.343 に答える
0

クラス B と A が独自の oneMethod を実装する必要がある場合は、継承リンクにないためである可能性がありますが、同じインターフェイスを実装する必要がありますか?

于 2013-08-21T15:06:39.290 に答える