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.
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.
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.
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.