23

Java(C ++プログラマー)に少し問題があります。

私には2つの関連するクラスがあります:

public class Patient() {
...
}

public class PatientPersistent extends Patient {
...
    public void foo() {
    System.out.println(super.getClass().toString());
    }
}

これは出力します:

クラスorg.example.smartgwt.server.model.PatientPersistent

親クラスタイプを取得する方法はありますか?すなわち

クラスorg.example.smartgwt.server.model.Patient。

これにより、ひどい各子に実装する必要のあるいくつかのメソッドを一般化することができます。

ありがとう!


アップデート

Dozerを使用して、ドメインのHibernateオブジェクトをSerializableバージョンに変換しています。クライアントにこれを知らせたくないので、クライアントには患者クラスのみが表示されます。サーバー側では、変換を実行します。

public class DataObject<Type> {

    private static final Class<Object> DstType = Type;

    public Object convert(Object srcData, final BeanFactory factory) {
        Mapper mapper = (Mapper)factory.getBean("dozerMapper");

        return (Object)mapper.map(srcData, DstType);
    }
}

public class Patient() implements Serializable {
    public Set foo;
}    

public class PatientPersistent extends Patient {

    public org.hibernate.collection.PersistentSet foo;
    DataObject<Patient> converter = new DataObject<Patient>;

    public Patient convertToSerializable(final BeanFactory factory) {
        return (Patient)converter.convert(this, factory);
    }
}

public class main() {
    // This object is not serializable so I cannot send it to the client
    PatientPersistent serializableBar = new PatientPersistent();

    // Using Dozer to copy the data PatientPersistent -> Patient
    // This will load the Dozer spring bean and copy as mapped
    Patient copiedSerializableData = serializableBar.convertToPersistent(bar, factory);
}

私はこのコードが機能しないことを知っていますが、それは私の主張をするためだけのものです。オブジェクトをシリアル化可能な形式に変換して、クライアントに送り返すことができるようにしたいと思います。そのため、親のタイプを指定したいと思います。マッパーの呼び出しは常に同じものであり、ソースオブジェクトとDest.classです。

たぶん私はJavaとあまりにも混乱しています。

ありがとう

4

5 に答える 5

43
getClass().getSuperclass()

ただし、これは使用しないでください。それは確かに悪いデザインの兆候です。

于 2010-07-20T21:53:55.523 に答える
10

いいですね...super.getClass()は実際にはオブジェクトのgetClass()であり、呼び出されたインスタンスのランタイムタイプ(この場合はこれ)を返します。したがって、同じクラスを受け取ります...

スーパーの実装を使用してこのランタイムクラスを要求する代わりに、getClassによって返されるクラスのスーパークラスを要求する必要があります。

getClass().getSuperclass()

ちなみに、「これにより、それぞれの子供に実装する必要のある、ひどいメソッドを一般化できるようになる」とはどういう意味ですか?他にデザインの選択肢がないのですか?

于 2010-07-20T22:03:16.810 に答える
6

Object.getClass()オブジェクトの実行時タイプを返すためsuper、呼び出しの前に追加してもあまり効果はありません。

を使用できますgetClass().getSuperclass()

于 2010-07-20T21:54:27.720 に答える
2

試す:getClass().getSuperclass().toString()

于 2010-07-20T21:51:26.500 に答える
1

あなたが提案している方法で「魔法」の問題を解決することが、あまり柔軟ではない解決策につながることに多くの時間を費やしています。

スーパーのクラスを取得しようとしている場合、おそらく必要なのは、親の型を調べた後に実行しようとしているアクションを明示的に実装する、親のクラスのメソッドを呼び出すことです。

さらに、現在実装しているメソッドが実際に親クラスにあり、そのメソッドが子クラスに実装されている抽象メソッドを参照している場合、デザインがさらに良くなる可能性が高くなります。

もちろん、私はこれをすべて親のタイプを取得したいというあなたの願望から推測しており、完全に間違っている可能性がありますが、あなたの親のクラスを知っていることがあなたが探している答えである場合、あなたは間違った質問をしていると思います-戻る数フィート上がって、もう一度見てください。

于 2010-07-20T22:21:53.117 に答える