これは不可能だと感じていますが、そうでないと非常に便利です。親クラスをJavaにキャストできるようにクラスを拡張する
私は、子クラスが新しいメソッド、新しいコンストラクタ、新しいフィールドを持たないように親クラスを拡張しようとしています。そのため、子クラスの基礎となるデータ構造は親クラスと同じです。これは、組み込みのJavaクラス(たとえばVector3d
)に追加された関数を追加する場合に発生する傾向があります。基礎となるデータが同一であるとすれば、親クラスとして初期化されたオブジェクトを子クラスにダウンキャストすることが可能です。追加された機能を使用できます。私が何を意味するかの例では、新しいメソッドを使用する
import javax.vecmath.Vector3d;
public class Vector3dPlus extends Vector3d{
//same fields, same constructors as Vector3d
public double extraMethod(){
return x+y+z;
}
}
てみてください下に見るように、通常我々がVector3dPlus
メソッドが動作することを保証することはできませんので、明らかにJavaはこれに動揺します
import javax.vecmath.Vector3d;
public class Test {
public static void main(String[] args) {
Vector3d basic=new Vector3d(1,2,3);
useExtraMethod(basic); //this line correctly raises an exception, but is there a way around that
}
public static void useExtraMethod(Vector3dPlus plus){
System.out.println(plus.extraMethod());
}
}
をするVector3Dに追加すべてVector3d
です。しかし、とにかく私は基本的なデータ構造が同じであるので、すべてのダウンキャストをすべてVector3d
からVector3dPlus
に許可すると言うことができます。
私はこれに対処する現在の方法は、一般的なユーティリティクラス内のすべての余分なメソッドを置くことですが、それは明らかに恐ろしいビットだ
「Vector3dPlus」の代わりに「Vector3d」を作成する理由はありますか?そうでなければ: 'Vector3dPlus {super(int a、int b、int c); } ' – Aquillo
私はインタフェースを使用します – chrisw
最初にVector3dPlusとして初期化しない理由は、ライブラリを作成していて、従来のクラスを外部的に使用したいが、内部的に追加された関数を使用できるようにするためです。 –