2

共通のクラス(TextView)から派生した一連のクラスを装飾したいと思います。クラスはライブラリに存在するため、単純にベースを変更したり、継承階層に挿入したりすることはできません。

class A {
}

class B extends A {
}

class C extends A {
}

class D extends B {
    void decoration(){}
}

上記の例では、クラスDは装飾クラスです。装飾機能は、私の各装飾クラスに共通です。

私の質問は、Javaで基本クラスをテンプレート化することは可能ですか?何かのようなもの:

class D<T> extends <T ? extends A> {}
4

1 に答える 1

2

それで、あなたの質問は、既存のクラスに動的にメソッドを追加することについてですか?Objective-Cのカテゴリに似たもの。クラスがClassLoaderを介してロードされると、動的に何も追加できないため、これをJavaで行うのは簡単ではありません。

私の頭に浮かぶ最も簡単なことは、万が一既存のクラスの外部にあるカスタムマッピングを提供することです。何かのようなもの:

interface Method<T extends A> {
  public void invoke(T ref);
}

class MethodForA implements Method<A> {
  public void invoke(A ref) { .. }
}

class MethodMapper {
  Map<Class<?>, Method<? extends A>> mapping;

  MethodMapper() {
    mapping = new HashMap<Class<?>, Method<? extends A>>();
    mapping.put(A.class, new MethodForA());
  }

  void invoke(A object) {
    Method<? extends A> method = mapping.get(object.getClass());
    if (method != null) {
      method.invoke(object);
    }
  }

私は今この定型コードを書いたばかりなので、すべてが確実に正しくなるわけではありませんが、それが機能する方法はこれです。やみくもにキャストしないように、ランタイムタイプチェックを行う必要があると思います。

代わりに、これが合法かどうか疑問に思っていた場合:

class A {    
}

class B<T> extends A {   
}

class C<T, U> extends B<T> {
}

はい、そうです。typeパラメーターを導入することで、子クラスをジェネリックにすることができます。

于 2013-03-25T18:11:38.670 に答える