2010-05-26 3 views
2

복제 할 수있는 몇 가지 클래스가 있습니다 : GenericRow, GenericRows, ParticularRowParticularRows입니다. 다음과 같은 클래스 계층 구조가 있습니다. GenericRowParticularRow의 부모이고 GenericRowsParticularRows의 부모입니다. 각 클래스는 ICloneable을 구현합니다. 왜냐하면 각각의 인스턴스에 대한 전체 복사본을 만들 수 있기를 원하기 때문입니다.여러 클래스에서 ICloneable을 구현하는 중

object ICloneable.Clone() 
{ 
    object clone; 

    using (var stream = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter(); 

     // Serialize this object 
     formatter.Serialize(stream, this); 
     stream.Position = 0; 

     // Deserialize to another object 
     clone = formatter.Deserialize(stream); 
    } 

    return clone; 
} 

내가 다음 GenericRows 예를 들면, 간이 래퍼 방법을 제공 :

public GenericRows Clone() 
{ 
    return (GenericRows)((ICloneable)this).Clone(); 
} 

을 나는 간이 래퍼 방법을 찾고 잘 나는 나 자신이 각 클래스에 Clone()에 대한 동일한 코드를 작성 찾을 수 거의 코드가 아니기 때문에 각 클래스에서 거의 같습니다. 이 클래스에 따라 반환 유형, 캐스트 등으로 다릅니다. 그러나 ICloneable.Clone()과 동일합니다.은 4 개의 클래스 모두에서 동일합니다. 어떻게 든 추상화하여 한 곳에서만 정의 할 수 있습니까? 내 관심사는 몇 가지 유틸리티 클래스/object 확장 메서드를 만든 경우 제대로 복사 할 특정 인스턴스의 전체 복사본을 만들지 않을 것입니다. 어쨌든 좋은 생각입니까?

답변

2

회의에 들어가기 전에 몇 가지 코드 만 작성하면됩니다. Clone 메서드 내에서

public static class Clone 
{ 
    public static T DeepCopyViaBinarySerialization<T>(T record) 
    { 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      BinaryFormatter binaryFormatter = new BinaryFormatter(); 
      binaryFormatter.Serialize(memoryStream, record); 
      memoryStream.Position = 0; 
      return (T)binaryFormatter.Deserialize(memoryStream); 
     } 
    } 
} 

:

Clone() 
{ 
    Clone.DeepCopyViaBinarySerialization(this); 
} 
+0

'T 레코드'매개 변수 선언에 'this'를 추가하면 각 클래스에 Clone 메소드가 필요하지 않습니다 (즉, DeepCopyViaBinarySerialization을 확장 메소드로 변경). – dtb

+0

ICloneable에 대한 논쟁의 링크 : http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx – drewburlingame

1

구현 ICloneable 좋은 생각이 아니다 (프레임 워크 디자인 가이드 라인 참조).

BinaryFormatter를 사용하여 Clone 메서드를 구현하는 것은 흥미 롭습니다.

실제로 각 클래스에 대해 개별 Clone 메소드를 작성하는 것이 좋습니다.

public Class1 Clone() 
{ 
    var clone = new Class1(); 
    clone.ImmutableProperty = this.ImmutableProperty; 
    clone.MutableProperty = this.MutableProperty.Clone(); 
    return clone; 
} 

네, 당신은 이것으로 많은 것을 반복하지만, 여전히 최상의 해결책입니다.

+0

Lol @ 'interesting'. 그것이 내가받은 코드에서 깊은 사본이 만들어진 방법이며, 나는 그것을 바꾸기 위해 결코 신경 쓰지 않았습니다. –

관련 문제