Pregunta

Soy nuevo en C # (y programación orientada a objetos ). Cuando tengo algo de 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í Employee es un Manager, pero cuando lo eché al igual que a un Employee que significa que estoy upcasting?

Pregunta 2

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

¿Fue útil?

Solución

  1. Eso es correcto. Cuando se hace esto se le echándola en un objeto employee, lo que significa que no se puede acceder al Gestor de nada específico.

  2. downcasting es donde se toma una clase base y luego tratar de convertirlo en una clase más específica. Esto se puede lograr con el uso de IS y una conversión explícita de esta manera:

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

o con el operador as como esto:

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

Si algo no está claro seré feliz para corregirlo!

Otros consejos

upcasting (usando (Employee)someInstance) es generalmente fácil como el compilador se puede decir en tiempo de compilación si un tipo se deriva de otra.

downcasting sin embargo tiene que ser hecho en tiempo de ejecución en general como el compilador no siempre es fácil saber si la instancia en cuestión es del tipo dado. C # proporciona dos operadores para esto - es , que le indica si las obras abatidos, y devuelven verdadero / falso. Y como que intenta hacer el reparto y devuelve el tipo correcto, si es posible, o null 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 puede utilizar este

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 de una referencia subclase. (Subclase -> superclase) (es decir Manager -> Empleado)
  • downcasting es una operación que crea una referencia subclase de una referencia de clase base. (Superclase -> subclase) (es decir Empleado -> Manager)

En su caso

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

que está haciendo un upcasting.

Una conversión hacia arriba siempre tiene éxito a diferencia de un abatido que requiere una conversión explícita, ya que potencialmente puede fallar en tiempo de ejecución. ( InvalidCastException ).

C # ofrece dos operadores para evitar esta excepción sea lanzada:

A partir de:

Employee e = new Employee();

En primer lugar:

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

En segundo lugar:

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

Advertencia : Al hacer una conversión hacia arriba sólo se puede acceder a los métodos de la superclase, propiedades, etc ...

En caso de tener que comprobar cada uno de los objetos de los empleados si se trata de un objeto Manager, utilice 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..
}

Respuesta 1:   Si se llama upcasting pero la forma de hacerlo no es la forma moderna. Upcasting se puede realizar de forma implícita que no es necesario ningún tipo de conversión. Así que sólo escribir emp Empleado = mgr; es suficiente para upcasting.

Respuesta 2:   Si crea objeto de la clase Gestor podemos decir que es gerente de un empleado. Porque el Administrador clase: Empleado muestra relación es-un entre la clase Empleado y clase Manager. Por lo tanto, podemos decir que cada administrador es un empleado.

Pero si creamos objeto de la clase de empleado que no podemos decir que este empleado es director porque clase Employee es una clase que no se hereda cualquier otra clase. Así no se puede abatido directamente ese objeto Empleado Clase de objeto Class Manager.

Así que la respuesta es, si se quiere abatido de la clase Object Empleado a objeto Class Manager, primero debe tener objeto de la clase Gestor primero y luego puede upcast y luego se puede abatido a él.

upcasting y downcasting:

upcasting: Colada de derivado de la clase a la base de la Clase Downcasting: Colada de base de la Clase de clase derivada

Vamos a entender lo mismo que un ejemplo:

Considere dos clases Forma como Mi clase padre y el círculo como una clase derivada, que se define 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 = new Shape ();

Circle c = s;

Tanto cy s hacen referencia a la misma posición de memoria, pero ambos tienen diferentes puntos de vista es decir, utilizando "c" de referencia se puede acceder a todas las propiedades de la clase base y clase derivada también, pero el uso de "s" de referencia que puede acceder a las propiedades de la única clase padre.

Un ejemplo práctico de upcasting es clase Stream que es baseclass de todo tipo de lector de flujo del marco .NET:

StreamReader lector = new StreamReader (nuevo FileStreamReader ());

A continuación, FileStreamReader () se upcasted a streadm Reder.

downcasting:

Forma s = new Circle (); aquí como se explica más arriba, vista de s es el único padre, con el fin de que sea tanto para los padres y un niño que necesitamos abatido que

var c = (círculo) s;

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top