C# Language
ICloneable
수색…
통사론
- 개체 ICloneable.Clone () {반환 Clone (); } // 사용자 정의 공용 Clone () 함수를 사용하는 인터페이스 메소드의 개인 구현.
- 공용 Foo Clone () {새 Foo 반환 (this); } // 공용 복제 메소드는 복사 생성자 로직을 활용해야합니다.
비고
CLR
에는 형식 보호되지 않는 메서드 정의 object Clone()
이 필요합니다. 이 동작을 무시하고 포함하는 클래스의 복사본을 반환하는 형식 안전 메서드를 정의하는 것이 일반적입니다.
복제가 얕은 사본인지 깊은 사본인지를 결정하는 것은 작성자의 몫입니다. 참조가 포함 된 변경 불가능한 구조의 경우에는 전체 복사본을 만드는 것이 좋습니다. 클래스 자체가 참조 인 경우에는 얕은 복사본을 구현하는 것이 좋습니다.
참고 : C#
에서 인터페이스 메서드는 위에 표시된 구문을 사용하여 개별적으로 구현할 수 있습니다.
ICloneable을 클래스에서 구현하기
꼬임이있는 클래스에서 ICloneable
을 구현하십시오. 공개 형의 안전 Clone()
공개 해, Clone()
object Clone()
비공개로 구현 object Clone()
.
public class Person : ICloneable
{
// Contents of class
public string Name { get; set; }
public int Age { get; set; }
// Constructor
public Person(string name, int age)
{
this.Name=name;
this.Age=age;
}
// Copy Constructor
public Person(Person other)
{
this.Name=other.Name;
this.Age=other.Age;
}
#region ICloneable Members
// Type safe Clone
public Person Clone() { return new Person(this); }
// ICloneable implementation
object ICloneable.Clone()
{
return Clone();
}
#endregion
}
나중에 다음과 같이 사용됩니다.
{
Person bob=new Person("Bob", 25);
Person bob_clone=bob.Clone();
Debug.Assert(bob_clone.Name==bob.Name);
bob.Age=56;
Debug.Assert(bob.Age!=bob.Age);
}
bob
의 나이를 bob_clone
의 나이는 변경되지 않습니다. 이는 디자인에서 (참조) 변수를 지정하는 대신 복제를 사용하기 때문입니다.
구조체에 ICloneable 구현하기
구조체는 할당 연산자 =
사용하여 구성원 단위로 복사하기 때문에 일반적으로 구조체에 대한 ICloneable 구현은 필요하지 않습니다. 그러나 디자인은 ICloneable
에서 상속 한 다른 인터페이스를 구현해야 할 수도 있습니다.
또 다른 이유는 구조체에 복사가 필요한 참조 유형 (또는 배열)이 포함되어있는 경우입니다.
// Structs are recommended to be immutable objects
[ImmutableObject(true)]
public struct Person : ICloneable
{
// Contents of class
public string Name { get; private set; }
public int Age { get; private set; }
// Constructor
public Person(string name, int age)
{
this.Name=name;
this.Age=age;
}
// Copy Constructor
public Person(Person other)
{
// The assignment operator copies all members
this=other;
}
#region ICloneable Members
// Type safe Clone
public Person Clone() { return new Person(this); }
// ICloneable implementation
object ICloneable.Clone()
{
return Clone();
}
#endregion
}
나중에 다음과 같이 사용됩니다.
static void Main(string[] args)
{
Person bob=new Person("Bob", 25);
Person bob_clone=bob.Clone();
Debug.Assert(bob_clone.Name==bob.Name);
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow