沮丧和倒戈

我是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的时候,我怎样才能在任何可能的情况下下注他们?

  1. 那是对的。 当你这样做的时候,你把它转换成一个“员工”对象,这意味着你不能访问任何特定的经理。

  2. 向下转换是你把一个基类,然后尝试把它变成一个更具体的类。 这可以通过使用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时,你只能访问超类的方法,属性等…