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に関する限り、は型であるため、メソッドが含まれていないと文句を言います。instance
X
WrapX
instance
X
.bar()
もちろん十分に公平ですが、このサブクラスで、コードを散らかす明示的なキャストの帰属や変数のシャドウイングを必要とせずに、暗黙的にof(初期型の有効なサブクラス)にキャストするにはどうすればよいinstance
ですinstance
かY
?X
コンストラクターにこれがあった場合:
public WrapY(Y y){
this.instance = y;
}
インスタンスを構築する前に使用されることを確実に推測できないため、Eclipseはまだ.bar()
タイプのメソッドではないと文句を言います。X
WrapY(Y y)
WrapY
public void bar(){
instance.bar(); // ERROR
}
これが私が持っている現在のアプローチで、キャストが散らばっています:
public WrapY(Y y){
(Y)instance = y;
}
public void bar(){
((Y)instance).bar();
}
私の経験では、この特定のタイプのアーキテクチャの問題に遭遇したことはありません。「デコレータベースの継承型キャスト」(!)の下にファイルしてください...これをより適切にモデル化する方法について教えてください。仕方。
もう1つの問題は、将来誰かが拡張した場合、クラスが継承するインスタンスのタイプは、タイプであると合理的に想定できる場合WrapY
、自然な(キャストされていない)タイプになることです。X
Y
ありがとう