2016-08-20 3 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와 MemberwiseClone() 최상위 레벨에서도 더 많은 이론 읽기 https://en.wikipedia.org/wiki/Reference_%28computer_science%29 – Deniz

답변

4

Prototype Design Pattern은 클래스가 아닌 인스턴스입니다. CJEx 클래스의 인스턴스는 실제로 상속을 통해 기본 클래스의 모든 속성과 메서드를 상속합니다. 그러나 프로토 타입 패턴은 단순히 객체의 속성을 갖는 것이 아니라 속성의 값과 관련이 있습니다.

사실 프로토 타입 패턴과 abstract factory pattern의 차이점입니다. 프로토 타입 패턴은 프로토 타입 객체에서 설정된 방식으로 속성을 미리 채 웁니다. 추상 팩토리는 다음과 같이 설정된 속성을 가진 객체를 제공합니다. 기본값 또는 통화에서 제공 한 값이 포함됩니다.

+0

개체를 복사하여 동일하게 구현할 수 있습니다. 여기에 클론의 필요성은 무엇입니까? –

+0

@TomCruise "객체를 복사하면 동일하게 수행 할 수 있습니다."실제로는 아닙니다. 사본을 만들려면 객체의 정확한 유형을 알아야합니다. Clone을 사용하면 실제 클래스를 알지 못해도 하위 클래스를 복사하거나 생성자에 액세스하지 않고도 하위 클래스를 복사 할 수 있습니다. 즉, 복제는 객체 자체가 지시하는 복제입니다. – dasblinkenlight

+0

var obj1 = obj; 이것과 MemberwiseClone()의 차이점은 무엇입니까? 나는 여기에 객체 유형을 알 필요가 없다. –