1

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

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

public Person GetPersonById(long id)

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

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

public object GetPersonById(long id)

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

有没有人有更好的方法来做到这一点?

4

3 回答 3

4

如果它确实是,您可以Person转换为:CustomerCustomer

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);

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

于 2013-04-11T14:31:15.450 回答
2

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

于 2013-04-11T14:30:59.090 回答
0

使用“是”关键字

if(instance is ChildClass)
{
    //...
}
于 2013-04-11T14:30:47.567 回答