1

次のような抽象クラスがあるとします。

public abstract class Foo {
  public Foo (boolean bar) {...}
}

を拡張するクラスもありますFoo

public class FooThread extends Foo {}

名前FooThreadが示すように、スレッドになるため、Runnable を実装する必要があります。

implements Runnable問題は、拡張性と可読性 (またはその他の理由) の点で最適な場所は何か?

いくつかの代替案は次のとおりです。

1)implements抽象クラスに挿入します。

public abstract class Foo implements Runnable {}
  • 抽象クラスを見るとわかりやすい
  • 拡張性が低い

2)implements拡張クラスに挿入します。

public class FooThread extends Foo implements Runnable {}
  • 抽象クラスのスレッド機能に関するヒントはありません
  • より拡張可能

3) 拡張クラスに挿入し、抽象メソッドとして抽象implementsクラスに追加します。run()

public class FooThread extends Foo implements Runnable {}

public abstract class Foo {
  public Foo (boolean bar) {...}
  public abstract void run();
}
  • 抽象クラスを見たときの可読性
  • 拡張可能(まあ、少なくとももう少し柔軟)
  • 抽象クラスの抽象メソッドは一種の冗長です
  • "醜い"

implements Runnableまたはimplements Xyzを一般的に配置するためのベスト プラクティスはありますか? 最も早い段階で、または実際にインターフェイスを実装するクラスで? それとも、それは私たちが望むものに本当に依存していますか? 何がいいですか?

ご意見ありがとうございます。

4

3 に答える 3

2

そもそもそれを入れると必須になります。必要がない場合は、強制しないでくださいRunnable必要な場合はRunnable、インターフェイスを追加します。

したがって、この場合、私はあなたのオプション (2) にふっくらします:のすべてのサブクラスがスレッドとして実行可能である必要がない限り、抽象クラスではなくクラスに配置implements Runnableします (ただし、その名前はそれを示唆していません) .FooThreadFooFoo

同様に、すべての実装にそのメソッドが必要public abstract void run()でない限り、オプション (3) に従ってを追加する必要はありません。その場合は、オプション (1) に従って、代わりに単純に実装できます。FooRunnable

FooThreadという名前の方が適切なトーベンに同意しFooTaskます。Runnable が Thread ではない (Thread は Runnable ですが、その逆ではない) という理由だけでなく、「タスク」という言葉がよりビジネス ドメイン指向 (より高いレベルの抽象化) であるためでもあります。

于 2013-11-01T10:00:33.833 に答える
1

抽象クラスのすべてのインスタンスが実行可能なタスクとして使用されることになっている場合は、抽象クラスに Runnable インターフェイスを実装させます。

それ以外の場合は実装しないでください。

于 2013-11-01T10:00:58.570 に答える