Diferencia entre new y override (Herencia y polimorfismo)

04/05/2007 - 21:07 por ceguja | Informe spam
Saludos

Alguien que por favor me explique cuales son las diferencias puntuales entre
new y override, con respecto al polimorfismo en C#.

Muchas gracias
 

Leer las respuestas

#1 Daniel A. Calvin
07/05/2007 - 15:10 | Informe spam
Hola Gente

Agrego algo lo dicho por Diego.

El new debe usarse con sumo cuidado.
Se viola el principio de sustitución de Liskow.
Este principio dice basicamente que cualquier clase debe poder ser tratada
como su clase base.

Es uno de los pilares de la programación OOP. En realidad el tema es grave
porque justamente muchos programadores no conocen el significado del New, es
un nuevo metodo que no reemplaza al de la clase base.

Saludos



Daniel A. Calvin
MCP


"Diego Jancic" wrote:

Hola,
La diferencia es que el new sirve para ocultar un metodo de la clase
padre (de la cual se hereda). El override sirve para sobre-escribir
los metodos virtuales o abstractos de una clase. Creo que hay 2
diferencias:
una conceptual a nivel OOP, ya que el virtual, el override y el
abstract son conceptos que entran en lo que es OO. Pero el new me
parece que se acerca mas a ser un "hardcodeo" del metodo superior.
a nivel funcionamiento, cuando el JIT (o el CLR, no se a quien
corresponde esto en particular) realiza la ejecucion del metodo al que
se esta llamando se fija a que tipo pertenece. Es decir, supongamos la
siguiente estructura (clases y prototipos base):

class Animal
{
string Hablar()
{
return "Soy un Animal";
}
}

class Perro : Animal
{
string Hablar()
{
return "Soy un Perro, y este es un ejemplo muy original =P";
}
}

Ahora, si yo defino con NEW el metodo Hablar de la clase Perro, cuando
tenga un objeto contenido en una variable del tipo Animal las llamadas
a Hablar van a ser ejecutadas por el metodo Animal.Hablar, sin
importar si la instancia real es del tipo Perro o no.
Ej:

Animal a = new Animal();
a.Hablar(); // Devuelve "Soy un Animal"

Animal b = new Perro();
b.Hablar(); // Devuelve "Soy un Animal"

En cambio, si se define al metodo Animal.Hablar como virtual y en la
clase Perro se lo especifica como override, cuando el JIT (o CLR)
realize una llamada a Hablar va a verificar el tipo real del objeto y
va a hacer la llamada correspondiente.

Ej:
Animal a = new Animal();
a.Hablar(); // Devuelve "Soy un Animal"

Animal b = new Perro();
b.Hablar(); // Devuelve "Soy un Perro y ..."

Normalmente a mi no me gusta usar el new porque el funcionamiento
varia de como se lo utilice. Seria feo saber que en el framework estas
2 cosas funcionan diferente:

Ej 1:
DataSet ds = new DataSet();
DbDataAdapter da = new SqlDataAdapter(...);
da.Fill(ds)

Ej 2:
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(...);
da.Fill(ds)


Bueno, espero que se haya entendido algo...

Saludos!,
Diego


Preguntas similares