C# new vs override

Muhammad Maisam Abbas 16 febrero 2024
  1. la palabra clave new en C#
  2. la palabra clave override en C#
C# new vs override

Este tutorial discutirá la diferencia entre las palabras clave new y anular en C#.

la palabra clave new en C#

La palabra clave new es muy común en C#. Tradicionalmente, se puede utilizar en tres lugares distintos: operador, modificador y restricción.

El primer y más popular uso de la palabra clave new es como operador para crear objetos de clase e invocar sus constructores de clase en C#. Con la palabra clave new, los objetos de tipo valor como int y float se crean dentro de la pila, y los objetos de tipo referencia, como las clases definidas por el usuario, se crean dentro del montón.

Algunas cosas a tener en cuenta al utilizar la palabra clave new como operador son: solo asigna la memoria al objeto y no destruye ninguna memoria que dependa previamente del mismo alcance, y no podemos anular la funcionalidad de new palabra clave en C#.

En segundo lugar, al usar la palabra clave new como modificador, oculta los miembros de la clase base heredados de la clase derivada. La declaración anterior significa que en lugar de invalidar o declarar una nueva definición de ese miembro de clase heredado, la palabra clave new reemplaza la definición anterior de ese miembro en la clase base.

El tercer uso de la palabra clave new es relativamente poco común en comparación con los dos anteriores. Mientras usamos la palabra clave new como restricción, especificamos que el tipo genérico debe tener un constructor público sin parámetros adicionales.

La desventaja de este enfoque es que no podemos usarlo con un tipo abstracto.

Por el bien de este tutorial, usaremos la palabra clave new como modificador para ocultar la definición de la clase base de la clase derivada. En C#, el compilador oculta implícitamente la definición de cualquier función heredada de forma predeterminada.

El siguiente fragmento de código demuestra cómo podemos ocultar explícitamente la definición de una función heredada de la clase derivada usando la palabra clave new.

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public new void fun() { Console.WriteLine("Derived class");
}
public static void Main(string[] args) {
  BaseClass b = new BaseClass();
  DerivedClass d = new DerivedClass();
  BaseClass bd = new DerivedClass();
  b.fun();
  d.fun();
  bd.fun();
}
}

Producción :

Base class
Derived class
Base class

El resultado de los dos primeros objetos es bastante sencillo; el objeto BaseClass b hace referencia a la función fun() dentro de la clase base y el objeto DerivedClass d hace referencia a la función fun() dentro de la clase derivada.

Algo muy interesante ocurre cuando asignamos la referencia de la clase derivada a un objeto de la clase base bd e invocamos la función fun(). La función fun() dentro de la clase base todavía se ejecuta esta vez.

Esto se debe a que la implementación de la función fun() dentro de la clase base está oculta para la clase derivada.

Este mismo objetivo se puede lograr sin utilizar la palabra clave new. El siguiente fragmento de código muestra cómo podemos lograr el mismo objetivo sin utilizar la palabra clave new.

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public void fun() {
    Console.WriteLine("Derived class");
  }
  public static void Main(string[] args) {
    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    BaseClass bd = new DerivedClass();
    b.fun();
    d.fun();
    bd.fun();
  }
}

Producción :

Base class
Derived class
Base class

Tenga en cuenta que el resultado es el mismo que el enfoque anterior. La única diferencia aquí es que esta vez, recibimos una advertencia del compilador que dice que para ocultar explícitamente el miembro de la clase, use la palabra clave new.

advertencia del compilador sin nueva palabra clave

la palabra clave override en C#

En C#, el modificador override amplía el método heredado de la clase base. La palabra clave override proporciona una nueva implementación del método virtual heredado de la clase base.

Una cosa a tener en cuenta aquí es que no podemos usar la palabra clave override para extender un método no virtual o estático. La función en la clase base debe ser virtual, abstracta o anulada por otra superclase.

En el contexto de nuestro ejemplo anterior, el siguiente fragmento de código muestra cómo podemos usar el modificador override para ampliar la funcionalidad de una función virtual heredada de la clase base.

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public override void fun() {
    Console.WriteLine("Derived class");
  }
  public static void Main(string[] args) {
    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    BaseClass bd = new DerivedClass();
    b.fun();
    d.fun();
    bd.fun();
  }
}

Producción :

Base class
Derived class
Derived class

El resultado de los dos primeros objetos es bastante sencillo; el objeto BaseClass b hace referencia a la función fun() dentro de la clase base y el objeto DerivedClass d hace referencia a la función fun() dentro de la clase derivada.

La verdadera diferencia con la palabra clave new aparece cuando asignamos la referencia de la clase derivada a un objeto de la clase base bd e invocamos la función fun(). A diferencia de los dos ejemplos anteriores, esta vez se invoca la función fun() de la clase derivada.

La palabra clave override se usa para mostrar la implementación secundaria de una función virtual en su objeto principal, mientras que la palabra clave new se usa para ocultar la implementación secundaria de su objeto de clase principal.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Artículo relacionado - Csharp Keyword