0

申し訳ありませんが、その質問の見出しを作成する方法が本当にわかりません。たぶん、私がやろうとしていることの名前がわからないかもしれませんが、いくつかのコードで説明できます:

残念ながら、copy-constructor も public static copy メソッドも持たないクラスがあるとします。

class A
{
    private int i;  // <- private, cant access
    String x;       // <- even worse: cant access unless in same pkg!
    /* … other stuff, ctor, etc. … */
    public A clone()
    {
        A a = new A();
        a.i = i;
        a.x = x;
        return x;
    }
}

さらに推測すると、そのクラスのオブジェクトを返す関数がいくつかあります。

public static A someFn(x,y,z);

問題は、そのクラスから派生していくつかの機能を追加したいということです。残念ながら、Java には sizeof も、cc または静的コピー メソッドもありません。

だから私がするとき

class B extends A
{
    protected w;
    public B clone()
    {
       /* as usual */
    }
}

次に、B のクローンを作成して新しい B を取得できますが、返された A を someFn() から B に変換するにはどうすればよいですか。Java でスライスの反対を行う方法はありますか? クローンを作成しても、それはまだ A であり、フィールドごとにコピーすることはできません。これは C++ ではすべて簡単ですが、Java ではどのように行うのでしょうか?

4

4 に答える 4

3

A と B の設計を変更して、A を B に変換できるようにするか (意味がある場合: 犬をダルメシアンに変換するにはどうすればよいでしょうか?)、継承の代わりに合成を使用します。

public class B {
    private A a;
    private int w;

    public B(A a, int w) {
        this.a = a;
        this.w = w;
    }

    public int foo() {
        return a.foo();
    }

    // ...
}
于 2011-03-23T23:06:35.130 に答える
1

clone()Java では、 using operator を実装していませんnew。元の Java クラスを制御できることを願っています。これはベスト プラクティスに準拠していません。

super.clone()代わりに、以前の clone メソッドの結果が適用された正しい型のオブジェクトを魔法のように返す呼び出しを行います。

クローン メソッドを適切にオーバーライドする方法を参照してください。

于 2011-03-23T23:06:15.080 に答える
1

まず、クローン方法が間違っています。次のようなものになるはずです:

public A clone(){
    A result = (A)super.clone();
    result.i = i;
    result.x = x;
    return result;
}

Bのクローンは次のとおりです。

public B clone(){
    B result = (B)super.clone():
    result.w = w;
    return result;
}

A のインスタンスを取得し、必要なデータを A のそのインスタンスから取り出し、それを使用して B オブジェクトを作成するコンストラクタを B に含めることができます。

次に、次のように someFn(x,y,z) を呼び出すことができます。

B b = new B(someFn(x, y, z))

また、someFn が静的でなかった場合は、それを定義するクラスのサブクラスを記述し、someFn をオーバーライドして戻り値の型を次のように変更することもできます (この機能は共変の戻り値の型と呼ばれます)。

B someFn(x, y, z){
   ...
}
于 2011-03-23T23:08:23.440 に答える