垂头丧气的和向上转型(downcast and upcast)

2019-07-21 02:00发布

我是新来的C#(OOP)。 当我有类似下面的一些代码:

class Employee
{
    // some code
}


class Manager : Employee
{
    //some code
}

问题1:如果我有其他的代码,这是否:

   Manager mgr = new Manager();
   Employee emp = (Employee)mgr;

这里EmployeeManager ,但是当我投它像一个Employee就意味着我上溯造型吗?

问题2:

当我有几个Employee类对象和一些但不是所有的人都是Manager的,我该怎么垂头丧气在可能的地方?

Answer 1:

  1. 那是正确的。 当你做,你正在浇铸成一个employee对象,这样就意味着你不能访问任何特定的经理。

  2. 向下转换是你需要一个基类,然后试图把它变成一个更具体的类。 这可以用用的就是和显式类型转换是这样来完成:

     if (employee is Manager) { Manager m = (Manager)employee; //do something with it } 

或与as这样的操作:

Manager m = (employee as Manager);
if (m != null)
{
    //do something with it
}

如果有不清楚的地方,我会很乐意更正!



Answer 2:

上溯造型 (使用(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");

您也可以使用此

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");


Answer 3:

  • 上溯造型是创建从一个子类基准的基类引用的操作。 (子类 - >超类)(即管理器 - >员工)
  • 向下转换是创建从基类参考子类参考的操作。 (超 - >子类)(即,公司雇员 - >管理器)

你的情况

Employee emp = (Employee)mgr; //mgr is Manager

你正在做一个上溯造型。

一个上溯造型总是不同,需要有明确的转换,因为它可以在运行时可能会失败沮丧的成功。(InvalidCastException的 )。

C#提供了两种运营商为了避免这种异常被抛出:

从...开始:

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 

警告 :当你做一个上溯造型,你只能访问到父类的方法,属性等等...



Answer 4:

如果您需要检查每个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..
}


Answer 5:

答1:是的,它叫做上溯造型,但你做的方式是不是现代的方式。 上溯造型可以执行隐含你不需要任何转换。 所以,只是写员工EMP =经理; 是足够的向上转型。

答2:如果您创建Manager类的对象,我们可以说,经理是雇员。 因为类管理:员工描绘是-A Employee类和管理类之间的关系 。 因此,我们可以说,每一个经理是雇员。

但是,如果我们创建Employee类的对象,我们不能说这是员工,因为经理级员工是没有任何继承其他类的类。 所以你不能直接向下转换是Employee类对象管理器类对象。

所以答案是,如果你想从Employee类对象向下转型到管理类对象,首先你必须有Manager类的对象第一,那么你可以上溯造型,然后你可以向下转换它。



Answer 6:

上溯造型和向下转换:

向上转型:从派生类的铸造到基类向下转换:从基类投放到派生类

我们先来了解同一个例子:

考虑两个类的形状我的父类和Circle作为一个派生类,定义如下:

class Shape
{
    public int Width { get; set; }
    public int Height { get; set; }
}

class Circle : Shape
{
    public int Radius { get; set; }
    public bool FillColor { get; set; }
}

上溯造型:

形状s =新形状();

圆C = S;

无论C和S被引用到同一个内存位置,但二者有不同的看法,即使用“C”的参考,您可以访问的基类的所有属性和派生类为好,但使用“S”的参考,你可以访问属性唯一的父类的。

向上转型的一个实际的例子是流类,这是所有类型的.NET框架的流读取器的基类:

StreamReader的读者=新的StreamReader(新FileStreamReader());

在这里,FileStreamReader()被upcasted到streadm REDER。

向下转换:

形状s =新圈(); 这里如上所述,鉴于S的是唯一的家长,为了让两个父母和孩子,我们需要它向下转换

VAR C =(圆)S;

向下转换的实际的例子是按钮类WPF的。



文章来源: downcast and upcast