正确更新子类型

时间:2018-12-10 13:00:17

标签: c# generics inheritance

我正在尝试编写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方法中进行铸造似乎不是一个好主意。 我正在考虑使用use generic method。如果我有2级继承,那会很好。但是,如果继承太​​深,我需要使所有子类型通用直到最后一个子代。

是否有更好的方法来Update

1 个答案:

答案 0 :(得分:0)

您可以通过为子类型添加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)并引发某种(运行时)异常。