Это было задумано как комментарий к предыдущему ответу, но я думаю, что это слишком долго.
Наличие дочернего класса с конструктором, который берет экземпляр родительского класса и копирует данные из него, является довольно распространенным стандартом. Один из способов минимизировать головную боль, которую это может вызвать с несколькими уровнями наследования и другими классами, состоит в создании защищенной функции, которая выполняет эту работу, в этом случае мы назовем ее Assign. Предположим, у нас есть три класса Person
, Employee
и Manager
. Все они наследуют друг от друга в этом порядке.
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
protected void Assign(Person otherPerson)
{
Name = otherPerson.Name;
}
}
Теперь мы определяем Employee:
public class Employee : Person
{
private int employeeID;
public Employee() { }
public Employee(Person newEmployee) : this()
{
base.Assign(newEmployee);
}
public int EmployeeID
{
get { return employeeID; }
set { employeeID = value; }
}
protected new void Assign(Employee otherEmployee)
{
base.Assign(otherEmployee);
EmployeeID = otherEmployee.EmployeeID;
}
}
Затем мы следуем тому же примеру для менеджера:
public class Manager : Person
{
private string department;
public Manager() { }
public Manager(Employee newManager) : this()
{
base.Assign(newManager);
}
public string Department
{
get { return department; }
set { department = value; }
}
protected new void Assign(Manager otherManager)
{
base.Assign(otherManager);
Department = otherManager.Department;
}
}
Таким образом, метод Assign()
в каждом классе объявил new
, чтобы мы могли изменить сигнатуру и обеспечить функциональность поверхностного копирования для унаследованных классов.
Просто отметьте, что этот шаблон создает новый объект, который просто имеет те же данные, что и старый объект. Старый объект все еще существует, и существующие ссылки не будут указывать на ваш новый объект. На самом деле изменение ТИПА объекта не допускается.