Это было сделано как комментарий к предыдущему ответу, но я думаю, что это слишком долго.
Наличие дочернего класса с конструктором, который принимает экземпляр родительского класса и копирует данные из него, является довольно распространенным стандартом. Один из способов свести к минимуму головную боль, которая может привести к нескольким уровням наследования и другим классам, - создать защищенную функцию, которая выполняет эту работу, в этом случае мы будем называть ее 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
так, что мы можем изменить подписи, и есть возможность предоставлять неглубокие функции копирования унаследованным классам.
Просто обратите внимание, что этот шаблон создает объект NEW, который имеет только те же данные, что и старый объект. Старый объект все еще существует, и существующие ссылки не будут указывать на ваш новый объект. Фактическое изменение ТИПА объекта не допускается.
«this.Field1 = baseInstance.Field1» это то, чего я надеялся избежать. Альтернатива заключается в том, чтобы обернуть базовый класс и разоблачить его как свойство. Это похоже на меньшее зло –
В этом случае я бы не использовал наследование вообще, я бы сделал новый класс, содержащий экземпляр базового класса. Но если у вас есть доступ к коду, который создает объекты вашей учетной записи, просто измените их для создания объектов AccountXtra. Тогда вы можете делать все, что захотите. –