2016-08-20 92 views
1

任何人都可以解釋爲什麼我們需要在原型模式中使用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以及更多的理論閱讀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()有什麼區別?我不需要知道這裏的對象類型。 –