Override / virtual

27/12/2007 - 17:56 por Erick \(foxero\) | Informe spam
De otro foro me surgio una duda sobre Override / Virtual. Lo posteo aqui
por si me pueden ayudar.
..
Hice un ejemplo pero ahora me confundi un poco:

Si por ejemplo tengo esta clase definida con un metodo publico llamado MSG
en el namespace MisClases

namespace MisClases
..
public class fCheckBox: System.Windows.Forms.CheckBox
{
public void MSG()
{
System.Windows.Forms.MessageBox.Show("MSG de fcheckbox");
}
}

public class fCheckBoxReg : MisClases.fCheckBox
{
public void MSG()
{
System.Windows.Forms.MessageBox.Show("MSG de fcheckboxREG");
}
}

Veo que el metodo MSG se reemplaza sin tener que ponerle 'Override' en la
clase hija ni 'Virtual' a la clase base? Ese es el comportamiento normal?

Gracias

Preguntas similare

Leer las respuestas

#6 Rolando
28/12/2007 - 22:37 | Informe spam
Una preguntilla relacionada.

Si yo tengo una tercera clase que sea "NIETA" de la primera y hasta otra
'BIZNIETA', la palabra 'Virtual' en el metodo solo va a la clase base ?.
En todas las demás (hija, nieta y biznieta) se pone 'Override' ?



"Octavio Hernandez" escribió en el mensaje
news:%
Erick,

Cuidado!
En ausencia de virtual/override, el método por supuesto NO ES VIRTUAL, lo
que
quiere decir que EN LAS LLAMADAS A ESE METODO NO FUNCIONARA
EL POLIMORFISMO.
Para comprobar lo que te digo, solo tienes que hacer:

void prueba()
{
fCheckBox cb = new fCheckBoxReg();
// variable de la clase base
// instancia de la clase descendiente
// llamada al método
cb.MSG();
}

Verás que se llamará al método de la clase fCheckBox.
Luego prueba a poner virtual y override a los métodos, y ejecuta prueba()
otra vez. Verás que se llamará al método de fCheckBoxReg. ESO ES
POLIMORFISMO, o ENLACE TARDIO (late binding) o RESOLUCION
DE METODOS EN TIEMPO DE EJECUCION.

Slds - Octavio



"Erick (foxero)" <eric> wrote in message
news:%
De otro foro me surgio una duda sobre Override / Virtual. Lo posteo aqui
por si me pueden ayudar.
..
Hice un ejemplo pero ahora me confundi un poco:

Si por ejemplo tengo esta clase definida con un metodo publico llamado
MSG en el namespace MisClases

namespace MisClases
..
public class fCheckBox: System.Windows.Forms.CheckBox
{
public void MSG()
{
System.Windows.Forms.MessageBox.Show("MSG de fcheckbox");
}
}

public class fCheckBoxReg : MisClases.fCheckBox
{
public void MSG()
{
System.Windows.Forms.MessageBox.Show("MSG de fcheckboxREG");
}
}

Veo que el metodo MSG se reemplaza sin tener que ponerle 'Override' en la
clase hija ni 'Virtual' a la clase base? Ese es el comportamiento
normal?

Gracias






Respuesta Responder a este mensaje
#7 Pedro Luna Montalvo
29/12/2007 - 00:06 | Informe spam
Saludos,

Recuerda que en mis comentarios indicaba, que al no indicar la palabra
"override" en el método de la clase Hija, hacia que el compilador
automaticamente asuma ese método como si se hubiera utilizado la palabra
clave new (el compilador hace esto enviando ademas una advertencia).

Pues bien, si como indicas creamos una clase Nieta que hereda de la clase
Hija, al usar override vamos a obtener un error.
Esto porque el método reimplementado en la clase Hija (recordemos que el
compilador ha impuesto un new), representa un miembro que no es virtual, por
tanto la clase Nieta no tendrá un metodo al cual hacer un override.

Saludos,
Pedro Luna



"Rolando" escribió en el mensaje de
noticias:#
Una preguntilla relacionada.

Si yo tengo una tercera clase que sea "NIETA" de la primera y hasta otra
'BIZNIETA', la palabra 'Virtual' en el metodo solo va a la clase base ?.
En todas las demás (hija, nieta y biznieta) se pone 'Override' ?



"Octavio Hernandez" escribió en el mensaje
news:%
Erick,

Cuidado!
En ausencia de virtual/override, el método por supuesto NO ES VIRTUAL, lo
que
quiere decir que EN LAS LLAMADAS A ESE METODO NO FUNCIONARA
EL POLIMORFISMO.
Para comprobar lo que te digo, solo tienes que hacer:

void prueba()
{
fCheckBox cb = new fCheckBoxReg();
// variable de la clase base
// instancia de la clase descendiente
// llamada al método
cb.MSG();
}

Verás que se llamará al método de la clase fCheckBox.
Luego prueba a poner virtual y override a los métodos, y ejecuta prueba()
otra vez. Verás que se llamará al método de fCheckBoxReg. ESO ES
POLIMORFISMO, o ENLACE TARDIO (late binding) o RESOLUCION
DE METODOS EN TIEMPO DE EJECUCION.

Slds - Octavio



"Erick (foxero)" <eric> wrote in message
news:%
De otro foro me surgio una duda sobre Override / Virtual. Lo posteo
aqui por si me pueden ayudar.
..
Hice un ejemplo pero ahora me confundi un poco:

Si por ejemplo tengo esta clase definida con un metodo publico llamado
MSG en el namespace MisClases

namespace MisClases
..
public class fCheckBox: System.Windows.Forms.CheckBox
{
public void MSG()
{
System.Windows.Forms.MessageBox.Show("MSG de fcheckbox");
}
}

public class fCheckBoxReg : MisClases.fCheckBox
{
public void MSG()
{
System.Windows.Forms.MessageBox.Show("MSG de fcheckboxREG");
}
}

Veo que el metodo MSG se reemplaza sin tener que ponerle 'Override' en
la clase hija ni 'Virtual' a la clase base? Ese es el comportamiento
normal?

Gracias










Respuesta Responder a este mensaje
#8 Rolando
29/12/2007 - 00:44 | Informe spam

Pues bien, si como indicas creamos una clase Nieta que hereda de la clase
Hija, al usar override vamos a obtener un error.
Esto porque el método reimplementado en la clase Hija (recordemos que el
compilador ha impuesto un new), representa un miembro que no es virtual,
por tanto la clase Nieta no tendrá un metodo al cual hacer un override.





Entonces, abusando de tus conocimientos que se ve que son bastante
profundos, como podriamos resolver un caso real similar al descrito? es
decir, donde haya necesidad de tener mas de un nivel de herencia y un mismo
metodo virtual pueda implementar polimorfismo en cada nivel.
Respuesta Responder a este mensaje
#9 Octavio Hernandez
29/12/2007 - 01:42 | Informe spam
En C++ (donde no hay dos palabras claves, virtual y override, sino solo una,
virtual),
se dice "once virtual, always virtual". Aquí en C# habría que decir "si le
pones virtual
a un método de una clase, luego ponle override a ese método en todas sus
clases derivadas".
Si en algún momento no lo haces, rompes la cadena de polimorfismo.

Slds - Octavio

"Rolando" wrote in message
news:%
>
Pues bien, si como indicas creamos una clase Nieta que hereda de la clase
Hija, al usar override vamos a obtener un error.
Esto porque el método reimplementado en la clase Hija (recordemos que el
compilador ha impuesto un new), representa un miembro que no es virtual,
por tanto la clase Nieta no tendrá un metodo al cual hacer un override.





Entonces, abusando de tus conocimientos que se ve que son bastante
profundos, como podriamos resolver un caso real similar al descrito? es
decir, donde haya necesidad de tener mas de un nivel de herencia y un
mismo metodo virtual pueda implementar polimorfismo en cada nivel.







Respuesta Responder a este mensaje
#10 Rolando
29/12/2007 - 03:37 | Informe spam
Aclarado. Muchas gracias






"Octavio Hernandez" escribió en el mensaje
news:%
En C++ (donde no hay dos palabras claves, virtual y override, sino solo
una, virtual),
se dice "once virtual, always virtual". Aquí en C# habría que decir "si le
pones virtual
a un método de una clase, luego ponle override a ese método en todas sus
clases derivadas".
Si en algún momento no lo haces, rompes la cadena de polimorfismo.

Slds - Octavio

"Rolando" wrote in message
news:%
>
Pues bien, si como indicas creamos una clase Nieta que hereda de la
clase Hija, al usar override vamos a obtener un error.
Esto porque el método reimplementado en la clase Hija (recordemos que el
compilador ha impuesto un new), representa un miembro que no es virtual,
por tanto la clase Nieta no tendrá un metodo al cual hacer un override.





Entonces, abusando de tus conocimientos que se ve que son bastante
profundos, como podriamos resolver un caso real similar al descrito? es
decir, donde haya necesidad de tener mas de un nivel de herencia y un
mismo metodo virtual pueda implementar polimorfismo en cada nivel.










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