c# oop downcasting upcasting

c# - abatido y upcast



oop downcasting (5)

Soy nuevo en C # (y OOP ). Cuando tengo algún código como el siguiente:

class Employee { // some code } class Manager : Employee { //some code }

Pregunta 1 : Si tengo otro código que hace esto:

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

Aquí el Employee es un Manager , pero cuando lo lanzo así a un Employee , ¿significa que lo estoy subiendo?

Pregunta 2 :

Cuando tengo varios objetos de clase Employee y algunos pero no todos son de Manager , ¿cómo puedo bajarlos cuando sea posible?


  1. Eso es correcto. Cuando lo haces, lo estás convirtiendo en un objeto employee , lo que significa que no puedes acceder a nada específico del administrador.

  2. Downcasting es donde tomas una clase base y luego tratas de convertirla en una clase más específica. Esto se puede lograr con el uso de is y un molde explícito como este:

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

o con el operador as como este:

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

Si algo no está claro, estaré encantado de corregirlo.


En caso de que necesite verificar cada uno de los objetos del Empleado, ya sea un objeto Manager, use el método 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 y Downcasting:

Upcasting: conversión de clase derivada a clase base Downcasting: conversión de clase base a clase derivada

Entendamos lo mismo que un ejemplo:

Considere dos clases de Forma como Mi clase principal y Círculo como una clase Derivada, definida de la siguiente manera:

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; } }

Upcasting:

Forma s = nueva forma ();

Círculo c = s;

Tanto c como s hacen referencia a la misma ubicación de memoria, pero ambas tienen diferentes vistas, es decir, con la referencia "c" puedes acceder a todas las propiedades de la clase base y de la clase derivada pero con la referencia "s" puedes acceder a las propiedades de la única clase de padres.

Un ejemplo práctico de upcasting es la clase Stream, que es la clase base de todos los tipos de lectores de flujo de .NET Framework:

Lector StreamReader = nuevo StreamReader (nuevo FileStreamReader ());

aquí, FileStreamReader () se actualiza a streadm reder.

Downcasting:

Forma s = nuevo Círculo (); aquí como se explicó anteriormente, view of s es el único padre, para poder hacerlo tanto para padres como para un hijo, tenemos que bajarlo

var c = (Circle) s;

El ejemplo práctico de Downcasting es la clase de botón de WPF.


Upcasting (usando (Employee)someInstance ) es generalmente fácil ya que el compilador puede decirle en tiempo de compilación si un tipo es derivado de otro.

Downcasting, sin embargo, tiene que hacerse en tiempo de ejecución en general, ya que el compilador puede no saber siempre si la instancia en cuestión es del tipo dado. C # proporciona dos operadores para esto: es el que le dice si el downcast funciona, y devuelve verdadero / falso. Y como cuál intenta hacer el molde y vuelve el tipo correcto si es posible, o nulo si no.

Para probar si un empleado es un gerente:

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

También puedes usar esto

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


  • Upcasting es una operación que crea una referencia de clase base a partir de una referencia de subclase. (subclase -> superclase) (es decir, Manager -> Empleado)
  • Downcasting es una operación que crea una referencia de subclase a partir de una referencia de clase base. (superclase -> subclase) (es decir, Empleado -> Administrador)

En tu caso

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

estás haciendo un upcasting.

Un upcast siempre tiene éxito a diferencia de un downcast que requiere un lanzamiento explícito porque puede fallar potencialmente en el tiempo de ejecución. ( InvalidCastException ).

C # ofrece dos operadores para evitar que se produzca esta excepción:

Empezando desde:

Employee e = new Employee();

Primero:

Manager m = e as Manager; // if downcast fails m is null; no exception thrown

Segundo:

if (e is Manager){...} // the predicate is false if the downcast is not possible

Advertencia : cuando haces un upcast, solo puedes acceder a los métodos, propiedades, etc. de la superclase ...