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

Preguntas similare

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


Respuesta Responder a este mensaje
#2 Diego Jancic
07/05/2007 - 15:27 | Informe spam
Jejeje... justo la otra vez esta pensando en vos para profundizar en
ese tema, que bueno que estes leyendo! ;)

Salu2!,
Diego
Respuesta Responder a este mensaje
#3 ceguja
07/05/2007 - 16:55 | Informe spam
Para Javier, Diego, Daniel y Octavio, Muchas gracias por sus respuestas. No
saben cuanto me ayudaron a aclarar ese concepto en mi cabeza. Me tenia loco.

Muchas gracias y cordial saludo

"ceguja" wrote:

Saludos

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

Muchas gracias
Respuesta Responder a este mensaje
#4 Daniel A. Calvin - Cooperator Team
08/05/2007 - 00:44 | Informe spam
ja ja, medio pasado soy no?
leo siempre, algunas veces no tengo el tiempo que me gustaria tener para
participar

Un abrazo Diego


Daniel A. Calvin
Cooperator Team Member
http://www.cooperator.com.ar
Microsoft Certified Professional


"Diego Jancic" escribió en el mensaje
news:
Jejeje... justo la otra vez esta pensando en vos para profundizar en
ese tema, que bueno que estes leyendo! ;)

Salu2!,
Diego

Respuesta Responder a este mensaje
#5 Hernan
08/05/2007 - 15:39 | Informe spam
El new debe usarse con sumo cuidado.
Se viola el principio de sustitución de Liskow.



Para los que quieran profundizar en el tema, es "Liskov" con V.

Este principio dice basicamente que cualquier clase debe poder ser tratada
como su clase base.



Dicho de otra forma, en cualquier lugar donde se espera un objeto
de tipo T debe ser posible reemplazarlo por un objeto de tipo S,
siendo S un subtipo de T.

-H.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida