gpt4 book ai didi

C# 继承 : casting of parent object to child

转载 作者:太空宇宙 更新时间:2023-11-03 19:16:43 24 4
gpt4 key购买 nike

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

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

public Person GetPersonById(long id)

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

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

public object GetPersonById(long id)

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

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

最佳答案

你可以将 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);

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

关于C# 继承 : casting of parent object to child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15951411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com