29 - Orden de ejecución de los constructores con herencia |
Cuando tenemos constructores en las clases y subclases el orden de ejecución de los mismos es :
Primero se ejecuta el constructor de la clase Padre. Segundo se ejecuta el constructor de la subclase.
Plantear tres clases A, B, C que B herede de A y C herede de B. Definir un constructor a cada clase que muestre un mensaje. Luego definir un objeto de la clase C.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Herencia3 { public class A { public A() { Console.WriteLine("Constructor de la clase A"); } } public class B : A { public B() { Console.WriteLine("Constructor de la clase B"); } } public class C : B { public C() { Console.WriteLine("Constructor de la clase C"); } } class Prueba { static void Main(string[] args) { C obj1 = new C(); Console.ReadKey(); } } }
Como se puede ver con la ejecución del programa la salida por pantalla es:
Constructor de la clase A Constructor de la clase B Constructor de la clase C
Es decir cuando creamos un objeto de la clase C lo primero que se ejecuta es el constructor de la clase de nivel superior (en este caso la clase A), luego el constructor de la clase B y finalmente se ejecuta el constructor de la clase C.
Plantear tres clases A, B, C que B herede de A y C herede de B. Definir un constructor a cada clase que reciba como parámetro un entero. Luego definir un objeto de la clase C.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Herencia4 { public class A { public A(int a) { Console.WriteLine(a); } } public class B : A { public B(int b):base(b/2) { Console.WriteLine(b); } } public class C : B { public C(int c):base(c/2) { Console.WriteLine(c); } } class Prueba { static void Main(string[] args) { C obj1 = new C(20); Console.ReadKey(); } } }
Como podemos ver la clase el constructor de la clase C debe llamar en forma explícita al constructor de la clase padre mediante la palabra clave base con el valor a pasar (en este ejemplo le pasamos el parámetro c dividido por dos):
public C(int c):base(c/2)
En forma similar el constructor de la clase B debe llamar al constructor de la clase A:
public B(int b):base(b/2)
Si ejecutamos el programa podemos ver que aparece por pantalla los números:
5 10 20
Donde definimos el objeto obj1 pasamos el valor 20, el constructor de la clase C llama al constructor de la clase B pasando el valor 10, luego el constructor de la clase B llama al constructor de la clase C pasando el valor 5. Como vimos anteriormente primero se ejecuta el constructor de la clase A mostrando el valor 5, seguidamente el constructor de la clase B mostrando el valor 10 y finalmente se ejecuta el constructor de la clase A mostrando el 20.