use*_*805 80 c# oop downcast upcasting
我是C#(和OOP)的新手.当我有一些如下代码:
class Employee
{
// some code
}
class Manager : Employee
{
//some code
}
Run Code Online (Sandbox Code Playgroud)
问题1:如果我有其他代码执行此操作:
Manager mgr = new Manager();
Employee emp = (Employee)mgr;
Run Code Online (Sandbox Code Playgroud)
这Employee
是一个Manager
,但当我把它这样投射到Employee
它意味着我正在向上倾斜它?
问题2:
当我有几个Employee
类对象时,有些但不是全部都是它们Manager
,我怎么能在可能的情况下将它们转发?
RCI*_*CIX 83
那是正确的.当你这样做时,你将它投射到一个employee
对象中,这意味着你无法访问任何经理特定的东西.
向下转换是指基类,然后尝试将其转换为更具体的类.这可以通过使用is和这样的显式转换来完成:
if (employee is Manager)
{
Manager m = (Manager)employee;
//do something with it
}
Run Code Online (Sandbox Code Playgroud)或者as
像这样的运营商:
Manager m = (employee as Manager);
if (m != null)
{
//do something with it
}
Run Code Online (Sandbox Code Playgroud)
如果有什么不清楚我会很乐意纠正它!
Pre*_*gha 47
上传(使用(Employee)someInstance
)通常很容易,因为编译器可以在编译时告诉您类型是否来自另一个类型.
然而,向下转换必须在运行时完成,因为编译器可能并不总是知道所讨论的实例是否是给定的类型.C#提供了两个操作人员这一点- 是它告诉你,如果垂头丧气的作品,并返回真/假.而作为它试图做演员和返回正确的类型,如果可能的话,则返回null没有.
要测试员工是否是经理:
Employee m = new Manager();
Employee e = new Employee();
if(m is Manager) Console.WriteLine("m is a manager");
if(e is Manager) Console.WriteLine("e is a manager");
Run Code Online (Sandbox Code Playgroud)
你也可以用这个
Employee someEmployee = e as Manager;
if(someEmployee != null) Console.WriteLine("someEmployee (e) is a manager");
Employee someEmployee = m as Manager;
if(someEmployee != null) Console.WriteLine("someEmployee (m) is a manager");
Run Code Online (Sandbox Code Playgroud)
ove*_*mer 10
在你的情况下
Employee emp = (Employee)mgr; //mgr is Manager
Run Code Online (Sandbox Code Playgroud)
你在做一个向上倾斜.
upcast总是成功,不像需要显式转换的downcast,因为它可能在运行时失败.(InvalidCastException).
C#提供了两个运算符来避免抛出此异常:
从...开始:
Employee e = new Employee();
Run Code Online (Sandbox Code Playgroud)
第一:
Manager m = e as Manager; // if downcast fails m is null; no exception thrown
Run Code Online (Sandbox Code Playgroud)
第二:
if (e is Manager){...} // the predicate is false if the downcast is not possible
Run Code Online (Sandbox Code Playgroud)
警告:当您进行上传时,您只能访问超类的方法,属性等...
如果您需要检查每个Employee对象是否是Manager对象,请使用OfType方法:
List<Employee> employees = new List<Employee>();
//Code to add some Employee or Manager objects..
var onlyManagers = employees.OfType<Manager>();
foreach (Manager m in onlyManagers) {
// Do Manager specific thing..
}
Run Code Online (Sandbox Code Playgroud)