Правильно обновить подтипы - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь написать 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 override void Update(Person person)
     {
        base.Update(person);
        var employee = person as Employee;
        this.Id= employee.Id;
     }
 }

public class Manager: Employee
{
     public string Title;

     public override void Update(Person person)
     {
        base.Update(person);
        var manager = person as Manager;
        this.Title = manager.Title;
     }
 }

Это просто пример дампа, который говорит: у меня глубокий уровень наследования.На каждом уровне к подтипу добавляются дополнительные свойства.Я пытаюсь написать метод update для всех подтипов.

Метод приведения внутрь Update не кажется хорошей идеей.Я думаю использовать универсальный метод .Это было бы хорошо, если у меня есть 2 уровня наследования.Но если наследование слишком глубокое, мне нужно сделать все подтипы общими до последнего потомка.

Есть ли лучший способ сделать Update?

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете избежать приведения, добавив 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) в каждом подклассе и вызвать какое-то исключение (во время выполнения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...