문제

내가 왜 내가 물려 받아야하는지 설명해 주시겠습니까? ICloneable 그리고 구현 Clone() 방법?

딥 카피를하고 싶다면 내 메소드를 구현할 수 없습니까? 의 말을하자 MyClone()?

왜 내가 상속해야합니까? ICloneable? 장점은 무엇입니까? 코드를 "더 읽기 쉬운"하는 문제일까요?

도움이 되었습니까?

해결책

당신은 안됩니다. Microsoft는 구현을 권장합니다 ICloneable 인터페이스의 명확한 표시가 없기 때문에 귀하의 Clone 메소드는 "깊은"또는 "얕은"클론을 수행합니다.

보다 Brad Abrams 의이 블로그 게시물 2003 년에 (!) 자세한 내용은.

다른 팁

그만큼 ICloneable 상호 작용 그 자체로 그다지 유용하지 않습니다. 즉, 물체가 다른 것에 대해 알지 못하고 복제 할 수 있다는 것을 아는 것이 유용한 상황이 많지 않습니다. 이것은 예를 들어 매우 다른 상황입니다 IEnumerable 또는 IDisposable; 받아들이는 것이 유용한 상황이 많이 있습니다. IEnumerable 그것을 열거하는 방법 이외의 다른 것을 알지 못했습니다.

반면에, ICloneable 다른 제약과 함께 일반적인 제약으로 적용될 때 유용 할 수 있습니다. 예를 들어, 기본 클래스는 다수의 파생 상품을 유용하게 지원할 수 있으며, 그 중 일부는 유용하게 복제 될 수 있으며 일부는 할 수 없었습니다. 기본 유형 자체가 공개 클로닝 인터페이스에 노출 된 경우 복제 할 수없는 미분 유형은 Liskov 대체 원리를 위반합니다. 이 문제를 피하는 방법은 보호 된 방법을 사용하여 기본 유형 지원 복제를 수행하고 파생 유형이 적합한대로 공개 클로닝 인터페이스를 구현할 수 있도록하는 것입니다.

그것이 달성되면, WonderfulBase 유형 및 복제 할 수 있어야하며 클로닝을 지원하는 Wonderfulbase 객체를 수락하도록 코딩 할 수 있습니다 (베이스 타입 및 일반 유형 매개 변수 사용 및 ICloneable 제약 조건). 비록 ICloneable 인터페이스 자체는 깊고 얕은 복제를 나타내지 않습니다. WonderfulBase 복제 가능한지 여부를 나타냅니다 WonderfulBase 깊이 또는 얕은 청소해야합니다. 본질적으로, ICloneable 인터페이스는 정의하여 달성하지 못하는 것을 달성하지 못할 것입니다. ICloneableWonderfulBase, 모든 복제 가능한 기본 클래스에 대해 다른 이름을 정의하지 않아도됩니다.

ICloneable 논란의 여지가있는 BCL의 유물 중 하나입니다. IMHO가 그것을 구현해야 할 이유는 없습니다. 그 말로 복제 방법을 만들려면 구현합니다. ICloneable, 그리고 나는 내 자신의 강력한 유형 버전을 제공합니다. Clone.

문제 ICloneable 그것은 결코 표시되지 않았습니까? Clone 매우 다른 것들이 얕거나 깊은 사본이었습니다. 없다는 사실 ICloneable<T> Iclonable에 대한 Microsoft의 생각에 대한 표시 일 수 있습니다.

Matt는 맞습니다. 사용하지 마십시오. 직접 만들어 봐 Copy() 메소드 (또는 유사한 이름) 및 만들기 완벽하게 명확합니다 공개 API에서 귀하의 방법이 객체의 깊거나 얕은 사본을 생성하는지 여부.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top