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

#1 Pedro Luna Montalvo
27/12/2007 - 18:27 | Informe spam
Saludos,

El mismo efecto lo noté hace algún tiempo, sin embargo, vale mencionar que
si bien el Visual Studio no provoca un error, si provoca una ADVERTENCIA (de
nivel 2).

Es decir, que al compilar tu solución observarás una advertencia generada
sobre esta práctica, aunque el mismo te la dejará pasar y permitirá la
generación del ejecutable.

Algunos temas adicionales:

* Puedes cambiar el tratamiento de las advertencias en las propiedades del
proyecto, en la ficha "Generar", donde puedes indicar, por ejemplo, que
cualquier advertencia te la emita como si fuera un error.

* Si se compila código similar desde la línea de comandos, el ejecutable si
se generará, y al igual que el caso anterior, se mostrará la respectiva
advertencia.



Ahora, ¿que esta haciendo el compilador en este caso? Según puedo entender,
el siguiente código:

class Padre {
public void Metodo() {}
}

class Hijo : Padre {
public void Metodo() {}
}

se compila como si yo hubiera especificado lo siguiente (observar el new en
el miembro Metodo de la clase Hijo)

class Padre {
public void Metodo() {}
}

class Hijo : Padre {
public new void Metodo() {}
}


Es decir, el compilador está realizando el ocultamiento del método de la
clase Padre, de forma automática.

Para evitar que un desarrollador oculte accidentalmente un miembro, el
compilador emite una advertencia de que esto está ocurriendo, y nos indica
además que sintácticamente, si es correcto efectivamente que queremos
ocultar el miembro, lo indiquemos explícitamente con la palabra clave new,
con lo cual no aparecerá esa advertencia.

saludos,
Pedro Luna


"Erick (foxero)" <eric> escribió en el mensaje de
noticias:#
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
#2 Erick \(foxero\)
27/12/2007 - 19:20 | Informe spam
Parece que la version Express del 2008 que es la que estoy usando, no da la
advertencia o por lo menos la trae desactivada por defecto.

Gracias.


"Pedro Luna Montalvo" escribió en el mensaje
news:
Saludos,

El mismo efecto lo noté hace algún tiempo, sin embargo, vale mencionar que
si bien el Visual Studio no provoca un error, si provoca una ADVERTENCIA
(de nivel 2).

Es decir, que al compilar tu solución observarás una advertencia generada
sobre esta práctica, aunque el mismo te la dejará pasar y permitirá la
generación del ejecutable.

Algunos temas adicionales:

* Puedes cambiar el tratamiento de las advertencias en las propiedades del
proyecto, en la ficha "Generar", donde puedes indicar, por ejemplo, que
cualquier advertencia te la emita como si fuera un error.

* Si se compila código similar desde la línea de comandos, el ejecutable
si se generará, y al igual que el caso anterior, se mostrará la respectiva
advertencia.



Ahora, ¿que esta haciendo el compilador en este caso? Según puedo
entender, el siguiente código:

class Padre {
public void Metodo() {}
}

class Hijo : Padre {
public void Metodo() {}
}

se compila como si yo hubiera especificado lo siguiente (observar el new
en el miembro Metodo de la clase Hijo)

class Padre {
public void Metodo() {}
}

class Hijo : Padre {
public new void Metodo() {}
}


Es decir, el compilador está realizando el ocultamiento del método de la
clase Padre, de forma automática.

Para evitar que un desarrollador oculte accidentalmente un miembro, el
compilador emite una advertencia de que esto está ocurriendo, y nos indica
además que sintácticamente, si es correcto efectivamente que queremos
ocultar el miembro, lo indiquemos explícitamente con la palabra clave new,
con lo cual no aparecerá esa advertencia.

saludos,
Pedro Luna


"Erick (foxero)" <eric> escribió en el mensaje de
noticias:#
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
#3 Erick \(foxero\)
27/12/2007 - 19:45 | Informe spam
Perdon... Ya vi la advertencia.
No lo habia chequeado bien. Pero en todo caso no es nada grave ya que como
normalmente cuando uno quiere reemplazar un metodo si basta como
redefinirlo, pues mejor que tener que usar new o Virtual/override. Lo veo
como mas logico asi.



"Erick (foxero)" <eric> escribió en el mensaje
news:
Parece que la version Express del 2008 que es la que estoy usando, no da
la advertencia o por lo menos la trae desactivada por defecto.

Gracias.


"Pedro Luna Montalvo" escribió en el mensaje
news:
Saludos,

El mismo efecto lo noté hace algún tiempo, sin embargo, vale mencionar
que si bien el Visual Studio no provoca un error, si provoca una
ADVERTENCIA (de nivel 2).

Es decir, que al compilar tu solución observarás una advertencia generada
sobre esta práctica, aunque el mismo te la dejará pasar y permitirá la
generación del ejecutable.

Algunos temas adicionales:

* Puedes cambiar el tratamiento de las advertencias en las propiedades
del proyecto, en la ficha "Generar", donde puedes indicar, por ejemplo,
que cualquier advertencia te la emita como si fuera un error.

* Si se compila código similar desde la línea de comandos, el ejecutable
si se generará, y al igual que el caso anterior, se mostrará la
respectiva advertencia.



Ahora, ¿que esta haciendo el compilador en este caso? Según puedo
entender, el siguiente código:

class Padre {
public void Metodo() {}
}

class Hijo : Padre {
public void Metodo() {}
}

se compila como si yo hubiera especificado lo siguiente (observar el new
en el miembro Metodo de la clase Hijo)

class Padre {
public void Metodo() {}
}

class Hijo : Padre {
public new void Metodo() {}
}


Es decir, el compilador está realizando el ocultamiento del método de la
clase Padre, de forma automática.

Para evitar que un desarrollador oculte accidentalmente un miembro, el
compilador emite una advertencia de que esto está ocurriendo, y nos
indica además que sintácticamente, si es correcto efectivamente que
queremos ocultar el miembro, lo indiquemos explícitamente con la palabra
clave new, con lo cual no aparecerá esa advertencia.

saludos,
Pedro Luna


"Erick (foxero)" <eric> escribió en el mensaje de
noticias:#
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
#4 Octavio Hernandez
28/12/2007 - 00:57 | Informe spam
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
#5 Erick \(foxero\)
28/12/2007 - 01:54 | Informe spam
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.




Con Virtual/Override funciona como un delegado, no? Y por otra parte con
Virtual/override) no hace un casting automático.

Gracias por la aclaración.




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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida