Вы можете избежать приведения, добавив Update
перегрузки для подтипов, например:
public class Person
{
public string Name;
public virtual void Update(Person person)
{
this.Name = person.Name;
}
}
public class Employee : Person
{
public string Id;
public virtual void Update(Employee employee)
{
base.Update(employee);
this.Id = employee.Id;
}
}
public class Manager: Employee
{
public string Title;
public void Update(Manager manager)
{
base.Update(manager);
this.Title = manager.Title;
}
}
Возможным недостатком является то, что это оставляет базовые версии на месте и их можно использовать на всех уровнях, так что теперьВы можете сделать это:
var p = new Person { ... }
var m = new Manager { ... }
m.Update(p); // Updates only the Name
Если вы хотите предотвратить это, вам придется переопределить Update(<base type> x)
в каждом подклассе и вызвать какое-то исключение (во время выполнения).