我们知道无法将父对象强制转换为其子类之一。
那么解决以下问题的好方法是什么: 假设我有一个父类“Person”和两个子类:Customer和Employee。请注意,Person类是不是抽象(意味着它可以实例化)。 现在我得到了以下方法签名:
public Person GetPersonById(long id)
这使得返回Person或其子类之一成为可能。 如果我使用这种方法,我可以通过GetType()检查它是否是一个孩子。但是,我无法轻松访问特定于子类的字段/方法,因为我不能只是转换它。 一种方法是为每个子类实现一个构造函数,该子类将父类作为参数并返回一个新的子类实例。这有一个缺点,我仍然会有很多重复的代码(因为我必须在每个孩子中分配每个父字段)。
我能想到的另一种方法是将方法更改为:
public object GetPersonById(long id)
那样,我可以返回任何课程。我只是检查返回类的类型,然后正确地转换它。但不知何故,这种方法看起来很脏。
有人有更好的方法吗?
答案 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)
{
//...
}