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

时间:2013-04-11 14:28:46

标签: c# inheritance casting

我们知道无法将父对象强制转换为其子类之一。

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

public Person GetPersonById(long id)

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

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

public object GetPersonById(long id)

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

有人有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

如果真的是Person,您可以Customer投放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);

但是你仍然需要指定你在通话时试图获得的内容。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

使用“是”关键字

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