c#继承:将父对象强制转换为子对象

本文关键字:对象 转换 继承 | 更新日期: 2023-09-27 18:08:34

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

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

public Person GetPersonById(long id)

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

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

public object GetPersonById(long id)

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

有人有更好的方法吗?

c#继承:将父对象强制转换为子对象

如果确实是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);

但是您仍然需要指定在调用时要获取的内容。

但实际上你可以将父对象转换为它的子类型,如果对象是该类型

使用"is"关键字

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