2

コピー コンストラクターとオーバーライドされた clone() メソッド (同じクラス内ではない) を作成および実装する方法を理解するのに苦労しています。

「実際のコピー」の場合、単純なクローンではなくディープクローンを作成する必要があることを私は知っています(理解するのに長い時間がかかりました...)。私がここで見つけた (私にとって) 最も明白な解決策の 1 つは、コピー コンストラクターを作成することでした。

簡潔にするために、2 つの整数を保持する Dog オブジェクトがあるとします。別のクラス Cat には、100 個の Dog オブジェクトの配列で構成される Cat オブジェクトがあります (例: Dog[] cat = new Dog[100])。これまでに次のことを試しました。

// for a copy constructor
public Cat(Cat cat) {
    Dog[] copy = new Dog[100];
    for (int i = 0; i < 100; i++) {
        copy[i] = cat[i];
    }
}

そのようなものは常に型の不一致をもたらします (「式の型は配列型でなければなりませんが、Cat に解決されます」および「Cat から Dog に変換できません」)。私がいる場所が午前 5 時だからかもしれませんが、なぜこれがうまくいかないのかわかりません。コピーと猫は同類じゃないの?

独自の clone() メソッドでオーバーライドしようとすると、同じエラーが発生します。以前に clone() を使用したことがない (またはそのことについて見たことがない) ので、自分で考え出す前に、理解していないことを確認したいと思います。ただし、価値があるのは、以前に次のコメントアウトを行い、コンパイラーが return ステートメントでスローしたことです。

protected Cat clone() {
    Dog[] copy = new Dog[100];
    int count = 0;
    (while (count < cat.length) {
        copy[count] = (Dog) cat[count];
        count++;
    }
    return copy;
}

同型不一致エラー。ヘッダーを「保護された Dog[] clone()」に変更すると、コンパイラ エラーは解消されましたが、明らかに、どこにも行きませんでした。

助けてくれてありがとう!

4

2 に答える 2

1

あなたの場合Dog、オブジェクトにある s の配列をコピーしようとしていCatます。Catただし、オブジェクトを配列として使用しようとしています ( []and を使用してlength)

おそらく、cat の内容を新しい cat にコピーすることを意味します。次に、コンストラクターは次のようになります。

private Dogs[] myCatsDogs;

// for a copy constructor
public Cat(Cat otherCat) {
    this.myCatsDogs = new Dog[100];
    for (int i = 0; i < 100; i++) {
         this.myCatsDogs[i] = otherCat.myCatsDogs[i];
    }
}

方法についてもclone()同様です。また、クローンはあまり使用されないことに注意してください (正しく実装するのが難しいため、Bloch による効果的な Javaアイテム 10 も参照してください)。可能であれば、常にコピー コンストラクターを使用してください。

于 2012-12-04T10:52:42.250 に答える
0

これは、スタンドコピーコンストラクターを理解するための私の簡単な例です....

public class Dog {
public final List<String> names;
public int age;
public int weight;

public Dog() {
    names = new ArrayList<String>();
}

protected Dog(Dog original) {
    names = new ArrayList<String>(original.names);
    age = original.age;
    weight = original.weight;
}

public Dog copy() {
    return new Dog(this);
}

}

public class Dalmatian extends Dog {
    public int spots;

public Dalmatian() { }

protected Dalmatian(Dalmatian original) {
    super(original);
    spots = original.spots;
}

public Dalmatian copy() {
    return new Dalmation(this);
}

}

役立つことを願って....

于 2012-12-04T11:10:25.250 に答える