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:

Module Module1
    Public Class A

        Public Sub New()
            Console.WriteLine("Constructor de la clase A")
        End Sub

    End Class


    Public Class B
        Inherits A

        Public Sub New()
            Console.WriteLine("Constructor de la clase B")
        End Sub

    End Class


    Public Class C
        Inherits B

        Public Sub New()
            Console.WriteLine("Constructor de la clase C")
        End Sub

    End Class


    Sub Main()
        Dim obj1 As New C()
        Console.ReadKey()
    End Sub

End Module

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:

Module Module1
    Public Class A

        Public Sub New(ByVal a As Integer)
            Console.WriteLine(a)
        End Sub

    End Class


    Public Class B
        Inherits A

        Public Sub New(ByVal b As Integer)
            MyBase.New(b / 2)
            Console.WriteLine(b)
        End Sub
    End Class


    Public Class C
        Inherits B

        Public Sub New(ByVal c As Integer)
            MyBase.New(c / 2)
            Console.WriteLine(c)
        End Sub

    End Class


    Sub Main()
        Dim obj1 As New C(20)
        Console.ReadKey()
    End Sub

End Module

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 MyBase, el nombre del constructor (New) y el valor a pasar (en este ejemplo le pasamos el parámetro c dividido por dos):

    Public Class C
        Inherits B

        Public Sub New(ByVal c As Integer)
            MyBase.New(c / 2)
            Console.WriteLine(c)
        End Sub

    End Class

En forma similar el constructor de la clase B debe llamar al constructor de la clase A:

    Public Class B
        Inherits A

        Public Sub New(ByVal b As Integer)
            MyBase.New(b / 2)
            Console.WriteLine(b)
        End Sub
    End Class

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