7

これは不可能だと感じていますが、そうでない場合は非常に便利です。

子クラスが新しいメソッドのみを持ち、新しいコンストラクターも新しいフィールドも持たないように、親クラスを拡張しようとしています。したがって、子クラスの基礎となるデータ構造は親クラスと同じです。これは、組み込みの Java クラス (例: ) に追加機能を与えたい場合に発生する傾向がありますVector3d。基になるデータが同一で​​あれば、親クラスとして初期化されたオブジェクトを子クラスにダウンキャストして、追加された機能を使用することができます。私が意味することの例として、以下を参照してください

import javax.vecmath.Vector3d;

public class Vector3dPlus extends Vector3d{
    //same fields, same constructors as Vector3d

    public double extraMethod(){
        return x+y+z;
    }
}

Vector3dに追加された新しいメソッドを使用してみてください

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());
    }
}

通常、Vector3dPlusメソッドがすべてのVector3d. しかし、とにかく、基になるデータ構造が同じであるため、すべてVector3dから Vector3dPlus.

私がこれに対処する現在の方法は、すべての余分なメソッドを一般的なユーティリティ クラスに入れることですが、それは明らかに少し恐ろしいことです。

4

4 に答える 4

4

メソッドのオーバーロードとコピー コンストラクターを使用して実現できます。

public class Vector3dPlus extends Vector3d {
    public Vector3dPlus(Vector3d vector) {
        super( ... ); // parameters from vector
    }

    // rest of your Vector3dPlus code
}

テスト クラスで、メソッドをオーバーロードします。

    public class Test {

        public static void useExtraMethod(Vector3d vector) {
            useExtraMethod(new Vector3dPlus(vector));
        }

        public static void useExtraMethod(Vector3dPlus plus){
             System.out.println(plus.extraMethod());
        }

        public static void main(String[] args) {
           Vector3d basic=new Vector3d(1,2,3);
           useExtraMethod(basic); // this line works now
        }
    }
于 2013-04-29T09:16:32.487 に答える
2

クラス階層の基礎となるデータ構造には焦点を当てませんが、公開されている外部インターフェイスに焦点を当てます。

あなたの例では、Vector3DPlusクラスには にない追加のメソッドがありますVector3D。これにより、そのインターフェイスが基本クラスと区別され、完全に代用できなくなります。基本型がサブ型を期待するメソッドに渡されると、コンパイラは正しく例外を発生させます。

目的の動作を実現するために、何らかの形式の型チェックを回避できるとは思いません。どういうわけか、 のインスタンスのみVector3DPlusがメソッドに渡されるようにする必要があります。それがダウンキャスティングの代償です。

public static void main(String[] args) {
       Vector3d basic=new Vector3d(1,2,3);

       if(basic instanceof Vector3dPlus){
       useExtraMethod(basic); //this line correctly raises an exception, but is there a way around that
       }
}
于 2013-04-29T09:10:03.023 に答える
0

これはどう?

import javax.vecmath.Vector3d;

public class Vector3dPlus extends Vector3d{
    Vector3dPlus {
        super(int a, int b, int c);
    }

    public double extraMethod(){
        return x+y+z;
    }
}

次のように使用します。

import javax.vecmath.Vector3d;

public class Test {

    public static void main(String[] args) {
       Vector3d basic=new Vector3d(1,2,3);
       Vector3dPlus plus=new Vector3dPlus(1,2,3);

       useExtraMethod(basic);
       useExtraMethod(plus);
    }

    public static void useExtraMethod(Vector3d vector){
        if (vector instanceof Vector3dPlus) {
            System.out.println(((Vector3dPlus) vector).extraMethod());
        }
    }
}
于 2013-04-29T09:13:59.573 に答える