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.

Problema 1:

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.

Programa:

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.

Problema 2:

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.

Programa:

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.


Retornar