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
.
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.
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