2016-08-20 1 views
1

誰でも、なぜPrototypeパターンでMemberwiseClone()を使用する必要があるのか​​説明できますか?プロトタイプのパターンをC#

public abstract class AProtagonistEx 
{ 
    int m_health; 
    int m_felony; 
    double m_money; 
    // This is a reference type now 
    AdditionalDetails m_details = new AdditionalDetails(); 

    public int Health 
    { 
     get { return m_health; } 
     set { m_health = value; } 
    } 

    public int Felony 
    { 
     get { return m_felony; } 
     set { m_felony = value; } 
    } 

    public double Money 
    { 
     get { return m_money; } 
     set { m_money = value; } 
    } 

    public AdditionalDetails Details 
    { 
     get { return m_details; } 
     set { m_details = value; } 
    } 

    public abstract AProtagonistEx Clone(); 
} 



class CJEx : AProtagonistEx 
{ 
    public override AProtagonistEx Clone() 
    { 
     **return this.MemberwiseClone() as AProtagonistEx;** 
    } 
} 

デフォルトでは、親クラスのすべてのプロパティとメソッドは、子クラスでアクセスできます。このパターンの必要性は何ですか?

+0

プロトタイプの*コピー*を作成する必要があるため、リファレンスは作成しないでください。それ以外の場合は、同じオブジェクトへの参照を複数持つだけで、すべての変更がすべてのオブジェクトで可視になります。 – Luaan

+0

コピーと参照の違いは何ですか? –

+0

名前はメモリ位置への参照を示唆しているため(C/C++のポインタのように、この概念は.NETやC#に限定されません)。ただし、名前のコピーは、別のメモリ位置にコピーされたメモリ領域全体(参照によって指される)の複製を示唆します。参照によって指し示された記憶場所の内容は、当然致命的な結果を有する時間によって変更することができる。このhttp://www.albahari.com/valuevsreftypes.aspxを見てください。また、MemberwiseClone()のトップレベルであっても、より多くの理論的な読書については、https://en.wikipedia.org/wiki/Reference_%28computer_science%29 – Deniz

答えて

4

Prototype Design Patternは、インスタンスではなく、クラスについてです。 CJExクラスのインスタンスは、実際に継承を介して基本クラスのすべてのプロパティとメソッドを継承します。しかし、プロトタイプパターンは、オブジェクトのプロパティを持つだけではなく、プロパティの値に関係しています。

実際、これはプロトタイプパターンとabstract factory patternの違いです。プロトタイプパターンは、プロトタイプオブジェクトで設定された方法でプロパティを事前入力しますが、抽象ファクトリではプロパティが設定されていますデフォルト値、またはコールで指定した値を使用します。

+0

オブジェクトをコピーすることによっても同じことができます。ここでクローンする必要がありますか? –

+0

@TomCruise "オブジェクトをコピーすることでも同じことができます。"実際にはそうではありません。コピーを作成するには、オブジェクトの正確なタイプを知る必要があります。クローンを使用すると、実際のクラスを知らなくても、コンストラクタにアクセスすることなくサブクラスをコピーできます。言い換えれば、複製はオブジェクト自体によって指示されるコピーです。 – dasblinkenlight

+0

var obj1 = obj;これとMemberwiseClone()の違いは何ですか?私はここでオブジェクトの種類を知る必要はありません。 –