1

Javaには、抽象基本クラスがあります。WrapXたとえば、タイプのプロパティを含む、たとえばX(Decorator DPを考えてください)。Xこのクラスは、カプセル化された:で特定のメソッドを呼び出すメソッドを提供します。

public abstract class WrapX{

  protected X instance;

  public WrapX(X x){
     this.instance = x;
  }

  public void foo(){
       instance.foo();
  }

}

public class X {

   public void foo(){
       System.out.println("foo");
   }
}

Y次に、から拡張しXて追加のメソッドを提供するというクラスがあります。

public class Y extends X {

  public void bar(){
     System.out.println("bar");
  }
}

それから当然私はWrapYタイプの上に装飾されたタイプとして使用できるものを作成しましたY

public class WrapY extends WrapX{

  ...

  public void bar(){
    instance.bar();
  }

}

だからここに問題があります。親からtypeのプロパティをWrapY継承しました。Eclipseに関する限り、は型であるため、メソッドが含まれていないと文句を言います。instanceXWrapXinstanceX.bar()

もちろん十分に公平ですが、このサブクラスで、コードを散らかす明示的なキャストの帰属や変数のシャドウイングを必要とせずに、暗黙的にof(初期型の有効なサブクラス)にキャストするにはどうすればよいinstanceですinstanceYX

コンストラクターにこれがあった場合:

public WrapY(Y y){
 this.instance = y;
}

インスタンスを構築する前に使用されることを確実に推測できないため、Eclipseはまだ.bar()タイプのメソッドではないと文句を言います。XWrapY(Y y)WrapY

public void bar(){
        instance.bar(); // ERROR
      }

これが私が持っている現在のアプローチで、キャストが散らばっています:

public WrapY(Y y){
 (Y)instance = y;
}

public void bar(){
  ((Y)instance).bar();
}

私の経験では、この特定のタイプのアーキテクチャの問題に遭遇したことはありません。「デコレータベースの継承型キャスト」(!)の下にファイルしてください...これをより適切にモデル化する方法について教えてください。仕方。

もう1つの問題は、将来誰かが拡張した場合、クラスが継承するインスタンスのタイプは、タイプであると合理的に想定できる場合WrapY、自然な(キャストされていない)タイプになることです。XY

ありがとう

4

1 に答える 1

2

次に、Wrapクラスを汎用にすることができます。

public abstract class Wrap<T extends X>{

    protected T instance;

    public Wrap(T x){
        this.instance = x;
    }

    public void foo(){
       instance.foo();
    }
}



public final class WrapY extends Wrap<Y> {

    public WrapY(Y y) {
        super(y);
    }

    public void bar(){
        instance.bar();
    }
}

次に、のインスタンスの場合WrapY、はにinstanceなりますY


更新:WrapYからも継承したい場合(そして、ラップされたタイプの最後の問題が最も適切であることに対処したい場合)、次のようにします。

public class WrapY<U extends Y> extends Wrap<U> {

    public WrapY(U y) {
        super(y);
    }

    public void bar(){
        instance.bar();
    }
}
于 2012-10-06T10:12:45.793 に答える