沮丧和倒戈
我是C# (和OOP )的新手。 当我有如下的代码:
class Employee { // some code } class Manager : Employee { //some code }
问题1 :如果我有其他代码这样做:
Manager mgr = new Manager(); Employee emp = (Employee)mgr;
这里的Employee
是一名Manager
,但是当我把这样的Employee
投给一名Employee
这意味着我在向他们投资?
问题2 :
当我有几个Employee
类对象,但有些不是全部都是Manager
的时候,我怎样才能在任何可能的情况下下注他们?
-
那是对的。 当你这样做的时候,你把它转换成一个“员工”对象,这意味着你不能访问任何特定的经理。
-
向下转换是你把一个基类,然后尝试把它变成一个更具体的类。 这可以通过使用is和像这样的明确的转换来完成:
if (employee is Manager) { Manager m = (Manager)employee; //do something with it }
或者像这样的运算符:
Manager m = (employee as Manager); if (m != null) { //do something with it }
如果有什么不清楚的地方,我会很乐意纠正它!
上传 (使用(Employee)someInstance
)通常很容易,因为编译器可以在编译时告诉你是否从另一个派生types。
然而, 下行不得不在运行时进行,因为编译器可能并不总是知道所讨论的实例是否是给定的types。 C#为此提供了两个运算符 – 是告诉你是否downcast工作,并返回true / false。 并尝试执行转换,如果可能返回正确的types,否则返回null。
要testing员工是否是经理:
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");
你也可以使用这个
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");
如果您需要检查每个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.. }
- Upcasting是一个从子类引用创build基类引用的操作。 (子类 – >超类)(即经理 – >员工)
- 向下转换是一种从基类引用创build子类引用的操作。 (超类 – >子类)(即员工 – >经理)
在你的情况
Employee emp = (Employee)mgr; //mgr is Manager
你正在做一个倒戈。
一个上传总是成功,不像一个需要显式转换的downcast,因为它可能会在运行时失败( InvalidCastException )。
C#提供了两个运算符来避免抛出这个exception:
从…开始:
Employee e = new Employee();
第一:
Manager m = e as Manager; // if downcast fails m is null; no exception thrown
第二:
if (e is Manager){...} // the predicate is false if the downcast is not possible
Warnign :当你做一个upcast时,你只能访问超类的方法,属性等…