Estoy confundido con este código de abajo,¿Cuál es el método que hace MemberwiseClone()?
Developer devCopy = (Developer)dev.Clone();
método Clone de la clase desarrollador acaba de crear un clon del empleado, entonces, ¿cómo conseguir desarrollador otro clon del desarrollador.
public abstract class Employee
{
public abstract Employee Clone();
public string Name { get; set; }
public string Role { get; set; }
}
public class Typist : Employee
{
public int WordsPerMinute { get; set; }
public override Employee Clone()
{
return (Employee)MemberwiseClone();
}
public override string ToString()
{
return string.Format("{0} - {1} - {2}wpm", Name, Role, WordsPerMinute);
}
}
public class Developer : Employee
{
public string PreferredLanguage { get; set; }
public override Employee Clone()
{
return (Employee)MemberwiseClone();
}
public override string ToString()
{
return string.Format("{0} - {1} - {2}", Name, Role, PreferredLanguage);
}
}
Developer dev = new Developer();
dev.Name = "Bob";
dev.Role = "Team Leader";
dev.PreferredLanguage = "C#";
Developer devCopy = (Developer)dev.Clone();
devCopy.Name = "Sue";
Console.WriteLine(dev);
Console.WriteLine(devCopy);
/* OUTPUT
Bob - Team Leader - C#
Sue - Team Leader - C#
*/
Typist typist = new Typist();
typist.Name = "Kay";
typist.Role = "Typist";
typist.WordsPerMinute = 120;
Typist typistCopy = (Typist)typist.Clone();
typistCopy.Name = "Tim";
typistCopy.WordsPerMinute = 115;
Console.WriteLine(typist);
Console.WriteLine(typistCopy);
/* OUTPUT
Kay - Typist - 120wpm
Tim - Typist - 115wpm
*/
Por lo general, todo lo que necesita para clonar. Los campos primitivos son copias aisladas, definitivamente clonadas. No se notará el cambio de un campo primitivo de MemberwiseClone en el objeto fuente. Los campos de referencia del objeto son iguales. Apuntar a otro objeto no afectará al otro. Sin embargo, directamente después de las referencias al objeto MemberwiseCloning apuntan al mismo objeto. La clonación solo ocurre en el nivel de objeto directo, no es un proceso recursivo. En mi experiencia, no es común que necesites un clon profundo recursivo, por lo que normalmente no me molesto en crear una función Deep Clone. – Todd