나는 몇 가지 코드를 작성했으며, 두 개의 클래스 (즉, 물고기와 포유류는 아래에 있음)가 동일한 패턴을 가지고 있기 때문에 제네릭과 합산하기로 결정했다.ICloneable을 구현해야합니까?
문제는 내가 기본 클래스 부분에서 생성자를 복사 할 필요가있다.
또한,이 생성자 (0-매개 변수)들 기본 있지 않기 때문에 새로운() 제약 (CS0304)을 사용하여 고정 할 수 없습니다.
ICloneable을 구현하는 것이 좋은 습관이 아니라고 말했기 때문에 이것을 씁니다.
public class OneHeart {...}
public class TwoHeart {...}
public class Animal<TyHeart> /* : ICloneable ?*/ {
public Animal(TyHeart heart) {
if(heart==null) throw new ArgumentNullException();
Heart = heart;
}
public Heart { get; set; }
}
public class Fish : Animal<OneHeart> {
public Fish(OneHeart heart) : base(heart) {}
public Fish(Fish fish) : base(fish.Heart) {} // copy ctor but no use?
}
public class Mammal : Animal<TwoHeart> {
public Mammal(TwoHeart heart, Organ lung) : base(heart) {Lungs=lung;}
public Mammal(Mammal mammal) : base(mammal.Heart) {Lungs=mammal.Lung;}
public Organ Lungs {get; set;} // Mammal-only member:)
}
// The Zoo collects animals of only one type:
public class Zoo<TyHeart, TyAnimal> : LinkedList<TyAnimal>
where TyAnimal : Animal<TyHeart> {
public Zoo() : base() {}
public Zoo(Zoo<TyHeart, TyAnimal> srcZoo) {
foreach(var animal in srcZoo) {
// CS0304 compile error:
base.AddLast(new TyAnimal(animal));
}
}
...
}
물고기와 포유류 나는 그들이 모두 복사 생성자를 구현 알고있는 유일한 동물에서 파생 된 클래스와
있습니다.
EDIT : 깊은 복사가 필요하지 않습니다. 하트와 폐 (유형의)
는 싱글 및 동물/생선/포유류 사이에서 공유됩니다. 파생 생성자 선언에서 기본 (...) 다음을 제공함으로써 다르게 명시되지 않은 경우
상속 가능한 클래스에는 'MemberwiseClone'에 연결되지 않는 복제 멤버가 없어야합니다. 그렇지 않으면 파생 클래스의 인스턴스에서 'Clone'을 호출하면 파생 클래스를 오버라이드하지 않으므로 잘못된 유형의 인스턴스가 생성됩니다. – supercat
@supercat 모든 가상 메소드의 경우가 아닙니까? 잠시 ICloneable 인터페이스를 잊어 버리고 자신의 복제 메커니즘 (예 : Copy 메소드)을 구현했다고 가정 해보십시오. 이 메소드는 기본적으로 기본 유형에 대한 참조를 반환합니다. 상속자는이를 상속해야합니다. 그렇지 않으면 제대로 작동하지 않습니다. MemberwiseClone을 사용한다고해서 deep cloning 문제는 해결되지 않습니다. –
복제 멤버가'MemberwiseClone' (선호되는 보호 가상 메소드를 사용하여 연결) 체인을 구성하고 파생 클래스가 자체적으로 소유하고있는 변경 가능한 객체를 생성하지 않으면 부모의 복제 방법이 제대로 작동하여 파생 된 유형의 인스턴스 그렇지 않으면 모든 * 파생 클래스가 부모 메서드의 복사 생성자에 대한 체인 일 경우에도 복제 메서드 재정의를 정의해야합니다. 그렇게하지 않으면 컴파일러 진단이 발생하지 않습니다. – supercat