B 클래스에 A 클래스의 인스턴스를 저장하는 C# 코드가 있다고 가정 해 봅니다. A 클래스를 저장하는 B 클래스의 버전을 만들고 싶습니다. 따라서 B를 A 외부로 변경하면 B의 내부 A 객체 변경되지 않습니다.C#에서 다른 클래스 개체를 저장하는 클래스 개체를 얻는 방법?
class Engine
{
public int Horesepower = 500;
}
class Vehicle
{
public Vehicle(Engine engine) { Engine = engine; }
public Engine Engine;
}
class Program
{
static void Main(string[ ] args)
{
Engine v8 = new Engine();
Vehicle monsterTruck = new Vehicle(v8);
v8.Horesepower = 1000; // this changes the field Engine in yugo as well
Console.WriteLine(monsterTruck.Engine.Horesepower); // prints 1000 instead of 500
}
}
내가 B.에 전달하지만 분명히 깊은 클론이 널리 어떤 이유로 C#에서 사용하지 않는 것 때를 클론 템플릿 다리 클래스를 사용하여 C++에서이 문제를 방지 할 수 있습니다 (왜?). 누구든지이 저장 문제에 대해 좋은 방법을 제공 할 수 있습니까?
C++ 코드 : 당신이 복제하는 개체 값 유형을 포함하고 있지만, 일반적 경우 Clone()
는 사용자의 요구를 만족시킬 사용
template <typename T>
class Wrapper{
public:
Wrapper(const Wrapper<T> &orig){if(orig.data!=nullptr)data = orig.data->clone();}
Wrapper(const T &origdata){data = origdata.clone();}
Wrapper & operator=(const Wrapper<T> &orig){...}
...
~T(){delete data;}
private:
T *data;
}
class A{
public:
A():data(9){}
int data;
A *clone(){return new A(*this);}
}
class B{
public:
B(const Wrapper<A>& a_):ainner(a_){}
Wrapper<A> ainner;
}
int main(){
A a;
B b(a);
a.data =20;
std::cout << b.ainner.data; // prints 9 still
return 0;
}
당신은 깊은 복제를 직접 구현할 수 있습니다 도움이되기를 바랍니다이
처럼 복사 생성자를 사용하여 문제를 해결합니다. 'ICloneable' 인터페이스는 그 이유 때문에 존재합니다. (최고의 인터페이스 디자인은 아니지만 그게 뭔지.) http://msdn.microsoft.com/en-us/library/system.icloneable%28v=vs.110%29.aspx – xxbbcc
내가 아는 바로는 IClonable은 얕은 복제물과 깊은 복제물을 구별하지 못합니다. – user22119
'Clone()'은 일반적으로 딥 복제에 사용됩니다. 'Object.MemberwiseClone'는 이미 객체의 얕은 사본을 수행합니다. 인터페이스에 특별히 언급되지는 않았지만 설명서를 읽으면 딥 클론에 대해 설명합니다. 내가 말했듯이, 그것은 잘 설계된 인터페이스가 아닙니다. – xxbbcc