C sharp - override

 
Vista:
sin imagen de perfil

override

Publicado por Miguel (5 intervenciones) el 15/08/2016 11:57:03
Hola, buenos días

estoy en el camino de aprendizaje de c#, hay algo que no entiendo y agradecería aclaración, gracias.

bajo mi conocimiento, los métodos de una clase hija sustituyen los de una clase padre si se llaman igual que estos, cierto? y esto sucede siempre, por lo cual, que sentido tiene "override"?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

override

Publicado por Miguel (1 intervención) el 18/09/2016 02:01:21
Hola, en C# solo puedes sobreescribir metodos que estén declarados como "virtual" en la clase base, la única forma que tienes para hacer algo parecido al override de metodos no virtuales es usando la palabra "new", pero esto rompe muchos principios de diseño de software y buenas prácticas (ya que no lograrías poliformismo y tiende a confundir a quien utilice tus clases). voy a tratar de ilustrarlo con un ejemplo:

La clase base:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ClaseBase {
 
    public void DecirHola() {
        Console.WriteLine("Hola");
    }
 
    public virtual void DecirAdios() {
        Console.WriteLine("Adios");
    }
 
    public void DecirElSentidoDeLaVida() {
        Console.WriteLine("42");
    }
 
}

la clase hija

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ClaseHija: ClaseBase {
    public new void DecirHola() {
        Console.WriteLine("¡¿Qué Onda?!");
    }
 
    public override void DecirAdios() {
        Console.WriteLine("¡Ahí nos olemos!");
    }
 
    // El compilador te mostrará una advertencia de que
    // estas ocultando un metodo por herencia y que si 
    // esa es tu intencion deberías de utilizar la palabra new
    // https://msdn.microsoft.com/en-us/library/aa691135(v=VS.71).aspx
    public void DecirElSentidoDeLaVida() {
        Console.WriteLine("¿Acaso hay otra respuesta mas que 42?");
    }
}

Utilizando las clases:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Program {
 
    public void Main() {
 
        // comprobando polimorfismo
 
        ClaseBase sujeto = new ClaseHija();
 
        // esto imprimirá en consola "Hola" cuando tal vez
        // lo esperado por quien usa tu clase es que imprima
        // "¡¿Qué Onda?!" ya que como te mencioné el
        // polimorfismo no funciona cuando el metodo no
        // es virtual y no está como override en la clase hija.
 
        sujeto.DecirHola();
 
        // esto imprimirá en consola "¡Ahí nos olemos!" que
        // muy seguramente es lo que espera quien utiliza tu clase
 
        sujeto.DecirAdios();
 
        // al igual que el primer ejemplo, este imprimirá solo "42"
        // pero el compilador te mostrará una advertencia en la
        // declaración del metodo para que tu explícitamente le
        // indiques de que tu intencion es ocultar el metodo.
 
        sujeto.DecirElSentidoDeLaVida();
 
        // si quieres que escriba el mensaje de la clase hija tendrías
        // que hacer algo como esto: (pero eso acoplaría mucho tu
        // codigo a la implementación específica de la ClaseHija y
        // muy posiblemente esta no sea la intencion)
 
        ((ClaseHija) sujeto).DecirElSentidoDeLaVida();
    }
 
}

Espero haberte podido aclarar la diferencia y la necesidad de "virtual", "override" y "new".

Saludos,
Mike
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar