【问题标题】:c# inheritance: casting of parent object to childc#继承:将父对象强制转换为子对象
【发布时间】:2013-04-11 14:28:45
【问题描述】:

我们知道不可能将父对象强制转换为其子类之一。

那么什么是解决以下问题的好方法: 假设我有一个父类“Person”和两个子类:Customer 和 Employee。请注意,Person 类不是抽象的(意味着它可以被实例化)。 现在我得到了以下方法签名:

public Person GetPersonById(long id)

这使得返回 Person 或其子类之一成为可能。 如果我使用这种方法,我可以通过 GetType() 检查它是否是孩子。但是,我不能轻松访问特定于子类的字段/方法,因为我不能只转换它。 一种方法是为每个子类实现一个构造函数,该构造函数将父类作为参数并返回一个新的子类实例。这样做的缺点是我仍然会有很多重复的代码(因为我还必须为每个孩子分配每个父字段)。

我能想到的另一种方法是将方法更改为:

public object GetPersonById(long id)

这样,我可以返回任何课程。我只是检查返回的类的类型,然后正确地转换它。但不知何故,这种方法似乎很脏。

有人有更好的方法吗?

【问题讨论】:

    标签: c# inheritance casting


    【解决方案1】:

    如果确实是Customer,您可以将Person 转换为Customer

    var customer = person as Customer;
    if(customer != null)
    {
        // the person was really a Customer
    }
    

    如果您愿意,可以创建三个方法而不是一个:

    public Person GetPersonById(long id)
    public Customer GetCustomerById(long id)
    public Employee GetEmployeeById(long id)
    

    或者使用泛型(但在这种特殊情况下我对泛型感觉不好):

    public T GetPersonById<T>(long id) where T : Person
    

    并称它为:

    var person = GetPersonById<Employee>(123);
    

    但您仍然需要在通话时指定您想要获取的内容。

    【讨论】:

    • 不错的答案,为什么在这种情况下您对泛型感到难过?
    【解决方案2】:

    但实际上你可以将一个父对象转换为它的子类型,如果该对象属于那个类型

    【讨论】:

    • 好吧,我知道为什么我会做出错误的假设,即不能将父母转换为孩子:我使用的是实体框架,它创建了代理类,我总是匹配代理类的类型所以它永远不会起作用。
    【解决方案3】:

    使用“是”关键字

    if(instance is ChildClass)
    {
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多