c#继承:将父对象强制转换为子对象
本文关键字:对象 转换 继承 | 更新日期: 2023-09-27 18:08:34
我们知道不能将父对象强制转换为它的子类之一。
那么解决以下问题的好方法是什么呢?假设我有一个父类"Person"和两个子类:Customer和Employee。注意Person类是而不是抽象的(这意味着它可以被实例化)。现在我得到了以下方法签名:
public Person GetPersonById(long id)
这使得返回Person或它的一个子类成为可能。如果我使用这个方法,我可以通过GetType()检查它是否是子对象。但是,我不能容易地访问特定于子类的字段/方法,因为我不能仅仅强制转换它。一种方法是为每个子类实现一个构造函数,该构造函数将父类作为参数并返回一个新的子类实例。这样做的缺点是我仍然会有很多重复的代码(因为我必须在每个子字段中分配每个父字段)。
我能想到的另一种方法是将方法更改为:
public object GetPersonById(long id)
这样,我可以返回任何类。我只需要检查返回类的类型,然后正确地强制转换它。但不知何故,这种方法似乎很脏。
有人有更好的方法吗?
如果确实是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)
{
//...
}