扩展引用类型之间的转换

时间:2013-08-23 22:16:19

标签: c# type-conversion reference-type

我知道在扩展转换中,目标数据类型可以保存源数据类型提供的任何值。转换值类型时我能理解这一点, 但不能介于参考类型之间。我的问题来自以下情景:

public class Person
{
    public string Name { get; set; }
}

public class Employee : Person
{
    public string SurName { get; set; }
}
static void Main(string[] args)
{
    Employee emp = new Employee { Name = "Elvin", SurName = "Mammadov" };
    Person prs = emp;
}

如图所示, Person 类是 Empoyee 的祖先类。在previouse代码中,我创建了 Emplyee 类的引用,然后将 Employee 对象转换为Person。此时,我丢失了 SurName 数据字段和值。

我想知道:

  1. 可以保留任何值 表达式吗?

  2. 为什么将引用类型转换为直接或间接祖先类或接口是一种扩大转换?

  3. 感谢回复

1 个答案:

答案 0 :(得分:3)

它将被称为“扩展转换”,因为您在引用类型方面变得越来越不具体,您正在扩大潜在类型的集合。当您有Employee引用时,您知道可以使用该类特定的任何功能,当您对同一对象有Person引用时,您只知道可以使用{{Person中包含的功能。 1}}类。如果您想在Employee引用中使用prs特定功能,首先必须将您的引用转发回Employee引用,如果prs实际上不是键入Employee(也许类型为Customer,它也继承自Person),然后您将获得InvalidCastException

当您处理SurName引用时,Person属性不会消失。您无法访问它,因为它不包含在Person类中。基本上,如果您有基类类型的引用,您将只能访问基类中包含的属性/方法。它实际上是Employee没关系,你有一个Person引用,所以对象会被相应地处理。

转换在您的示例中无用。当您尝试以通用方式处理许多子类时,转换很有用。例如,我可能有一个Person课程。除此之外,我还有EmployeeCustomerConsultant类继承自它。现在假设我有一个Store对象,我想做一些事情,比如获取当前在商店中的每个Person的名字。解决此问题的最简单方法是与商店中的所有人员进行List<Person>。由于EmployeeCustomerConsultant都来自Person我可以做

peopleInMyStore.Add(MyEmployee);
peopleInMyStore.Add(MyCustomer);
peopleInMyStore.Add(MyConsultant);

然后我可以做类似的事情;

foreach (Person p in peopleInMyStore)
{
     Console.WriteLine(p.Name);
}

这个概念被称为“多态”,可以在这里阅读http://en.wikipedia.org/wiki/Polymorphism_(computer_science)

我的例子是人为的,但这是你使用继承的主要原因之一。为了给你一个真实的例子,我有一些测试代码,我有一个名为ApiTestSuite的类,然后我有大约十几个类,它们都从SpecificApiTestSuite形式继承。该项目构建为命令行可执行文件,您使用api参数(api = specificApiName)调用它然后我可以执行类似的操作;

 ApiTestSuite tests;
 if (args[0] == "api1")
     tests = new Api1TestSuite();
 else
     tests = new Api2TestSuite();
 tests.RunTests();