2

解決すべき実際の問題ではなく、技術と実装について質問があります。最近、サブクラスの共通の動作を定義する抽象クラスを作成しました。これを A と呼びましょう。

これを使用して、いくつかのサブクラス B、C、および D を構築し、それらをタイプ A を受け取るスーパークラス - サブクラス構造の外部にある他のメソッドに渡します (したがって、B、C、および D のすべてを処理できます)。

Java では、instanceof を使用して真の型を取得しますが、実際の型に多くのキャストを行う必要があり、混乱しているように見えます。コードをよりきれいにする方法について何か提案はありますか?

私が試した方法の 1 つは、スーパークラスのパラメーターからサブクラス型のインスタンスを再構築することでした。これにより、実際の型でオブジェクトを処理し、型キャストを回避できました。これらのサブクラスはそれぞれシングルトンなので (そうです、状態を維持します)、そうしても問題ないと思います。これは面倒なことのように思えますか?

答えてくれた人に感謝します。

編集:イタリック体でさらに明確化を追加しました。ありがとう。

4

4 に答える 4

3

タイプをチェックする必要がある場合、それらを基本クラスから継承させる理由がわかりません。抽象クラス/インターフェイス A は、B、C、および D が実装する必要がある一連の関数を定義します。その後、A のインスタンスを取る関数は、これらの抽象関数のみを呼び出す必要があります。B のみが含まれる (したがってオーバーライドされない) 関数を呼び出す必要がある場合、関数は A ではなく B のインスタンスを取る必要があります。

それとも私はポイントを完全に見逃していますか?今朝はカフェイン抜きです。

于 2009-07-16T13:44:14.640 に答える
3

ジェネリックはこれを処理するために作られています。

次の例を検討してください。

public class SuperClass<T extends SuperClass> {

     public abstract void someMethod(T param);

}


public class SubClassA extends SuperClass<SubClassA> {

    public void someMethod(SubClassA param) {}
}

編集:コメントを考えると、それはデザインの匂いだと思います。他のクラス全体を関連付けるためにサブクラスが必要になるか (その時点で同じ手法を適用できます)、または他の設計上の問題が関係しています。別のクラスのスーパークラスを取り、サブタイプを処理するクラスにメソッドがあるのは奇妙です。

それが必要な場合は、メソッドのオーバーロードで簡単に実現できます。検討:

  public void someMethod(SuperClass param) {
      if (param instanceof SubClassA) {
         someMethod((SubClassA) param);
      } else if (param instanceof SubClassB) {
         someMethod((SubClassB) param);
      }
  }

  public void someMethod(SubClassA param) {}

  public void someMethod(SubClassB param) {}

しかし、それで if トラップから抜け出すことはできません。ここでより重いソリューションが価値があるかどうかを確認するには、存在する数とそれらがどれほど不安定かによって異なります.

于 2009-07-16T13:33:28.587 に答える
0

訪問者のパターンが必要なようです。個人的には大ファンではありませんが、次のように機能します。

class A { abstract void visit(MyVisitor visitor); }

これは、各サブクラスで実装する必要があります。

class B extends A { 
    public void visit(MyVisitor v) { v.visit(this); }
}

したがって、実際の訪問者は次のようにオーバーロードを使用します。

interface MyVisitor {
   public void visit(B b);
   public void visit(C c);
}

これで、ビジターを実装visitし、A のインスタンスに対して呼び出すことができます。その後、正しいコールバック メソッドが呼び出されます。

A a = new B();
a.visit(this);

thisインスタンスが を実装すると仮定するとMyVisitor、これによりvisit(B)メソッドでコールバックが発生します。

于 2009-07-16T14:25:12.647 に答える