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
 

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



Preguntas similares