0

次のように、クラス Persona を拡張するクラス SuperYo があります。

public class SuperYo extends Persona {

   private NotSerializableObj obj1
   private NotSerializableObj obj2
   private NotSerializableObj obj3

}

public class Persona {

   private SerializableObj sObj1
   private SerializableObj sObj2
   private SerializableObj sObj3

}

問題は、LinkedList に SuperYo の Persona のインスタンスを追加することです。

LinkedList<Persona> list = new LinkedList<Persona>();
list.add((Persona) superYo);

SuperYo オブジェクトとして追加します。その上にすべての NonSerializableObjs がある...したがって、ソケットから送信することはできません:(。

それで、問題は...オブジェクトをその父クラスに「ダウンキャスト」する方法はあるので、その属性は存在しませんか?

ありがとう!

4

2 に答える 2

0

キャストはポリモーフィズムの問題です。type1 のオブジェクトを type2 にキャストすると、インスタンスは変化しませんが、新しい視点からインスタンスを見るだけです!

子クラスをネットワーク経由で送信する場合は、SuperYo メンバーを一時的に作成し、インスタンス化時にそれらを埋めることができます。または、子クラスに writeObject() および readObject() メソッドを追加できます。

于 2012-11-03T00:50:50.917 に答える
0

以下のように実装readObjectします。writeObjectSuperYo

 private void writeObject(ObjectOutputStream outStream) throws IOException {
    //write attributes from PersonYo only
    outStream.defaultWriteObject();
    outStream.writeObject(sObj1);
    outStream.writeObject(sObj2);
    outStream.writeObject(sObj2);
 }

private void readObject(ObjectInputStream inStream) throws IOException,
                                                          ClassNotFoundException {
    //read attributes from PersonYo only
    inStream.defaultReadObject();
    sObj1= (SerializableObj)inStream.readObject();
    sObj2= (SerializableObj)inStream.readObject();
    sObj3= (SerializableObj)inStream.readObject();
}

これを行うと、ダウンキャストの必要はなくなります。また、オブジェクト内の他のシリアル化できない属性をより適切に制御できる場合があります。

于 2012-11-03T00:55:10.900 に答える