C# 继承 : casting of parent object to child

标签 c# inheritance casting

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

那么解决以下问题的好方法是什么: 假设我有一个父类“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/

相关文章:

C# - 无法提交对 Access DB 的更改

c++ - C++中的最终类

java - 将监听器分配给类时遇到问题

c# - 如何判断对象是否为值类型

c# - ElasticSearch.Net-更新具有多个组件的数组

c# - 线程实践。建模应用

java - 什么算法在只有 < 的静态方法中运行 T 类型定义?超T> <?扩展 T> 参数?

c - 了解 uint32_t char 类型转换(字节)

java - 类转换异常

c++ - 无法将 uint8_t vector 迭代器转换为 const uint8_t *