这涉及到“沃森等人:开始的Visual C#第10章:练习4”: 落实人民类ICloneable接口,提供深度复制能力ICloneable接口
class People : DictionaryBase: ICloneable
public void DictAdd(Person newPerson)
{
Dictionary.Add(newPerson.Name, newPerson);
public object Clone()
{
People newPeople = new People();
foreach (Person myPerson in Dictionary.Values)
{
Person ClonePerson = (Person)myPerson.Clone();
newPeople.DictAdd(ClonePerson);
}
return newPeople;
}
在Person类的我们有:
public object Clone()
{
Person newPerson = new Person();
newPerson = (Person)newPerson.MemberwiseClone();
newPerson.Age = age;
newPerson.Name = name;
return newPerson;
}
要在Program.cs的测试:
People clonedPeople = (People)PeopleCollection.Clone();
PeopleCollection.Remove("Mick");
myPerson1.Name = "Jock";
myPerson1.Age = 13;
PeopleCollection.DictAdd(myPerson1);
Console.WriteLine("In the current collection \"Mick\" is now: \"{0}\" and his age is: {1}", myPerson1.Name, myPerson1.Age);
Console.WriteLine("But \"Mick\" should remain in the original collection, now cloned.");
foreach (DictionaryEntry p in clonedPeople)
{
Console.WriteLine();
Console.WriteLine("myPerson Name: {0} myPerson.Age: {1}", ((Person)p.Value).Name, ((Person)p.Value).Age);
}
这是有效的,并且“Mick”的原始值被保留。 但是问题在于首先在Person和People类上实现“:ICloneable”。代码在有或没有它的情况下工作相同。
一个相关的问题是
public class Content
{
public int Val;
}
public class Cloner: ICloneable
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
public object Clone()
{
Cloner clonedCloner = new Cloner(MyContent.Val);
return clonedCloner;
}
}
曾试图悲惨得到这个递归工作他们所说的在他们投放了“递归”实施ICloneable的疗效,但所有我们最终是一个StackOverflow。在使用全局/静态变量退出循环之后,是否存在一个优雅的方式来实现这个“递归?”
“代码在使用或不使用它时都是相同的。”你是什么意思,更具体一点。代码“没有它”是什么样的?同样在你的第二个例子中,你有两个克隆类,是一个错误? – Euphoric
对不起,我的意思是:类人:DictionaryBase而不是类人:DictionaryBase:ICloneable其他代码编辑,对不起。 –