Fundamentos de la herencia (Visual Basic)

La instrucción se usa para declarar una nueva clase, denominada clase derivada , basada en una clase existente, conocida Inherits como clase base. Las clases derivadas heredan y pueden extender las propiedades, métodos, eventos, campos y constantes definidos en la clase base. En la sección siguiente se describen algunas de las reglas de herencia y los modificadores que puede usar para cambiar la forma en que las clases heredan o se heredan:

  • De forma predeterminada, todas las clases son heredables a menos que estén marcadas con la NotInheritable palabra clave . Las clases pueden heredar de otras clases del proyecto o de clases de otros ensamblados a los que hace referencia el proyecto.

  • A diferencia de los lenguajes que permiten la herencia múltiple, Visual Basic solo permite la herencia única en las clases; es decir, las clases derivadas solo pueden tener una clase base. Aunque no se permite la herencia múltiple en las clases, las clases pueden implementar varias interfaces, lo que puede lograr eficazmente los mismos extremos.

  • Para evitar exponer elementos restringidos en una clase base, el tipo de acceso de una clase derivada debe ser igual o más restrictivo que su clase base. Por ejemplo, una clase no puede heredar una clase o y una Public Friend clase no puede Private Friend heredar una Private clase.

Modificadores de herencia

Visual Basic presenta las siguientes instrucciones y modificadores de nivel de clase para admitir la herencia:

  • Inherits statement : especifica la clase base.

  • NotInheritable modificador : impide que los programadores utilicen la clase como clase base.

  • MustInherit modificador : especifica que la clase está pensada para usarse solo como clase base. Las instancias de clases no se pueden crear directamente; solo se pueden crear como instancias de clase MustInherit base de una clase derivada. (Otros lenguajes de programación, como C++ y C#, usan el término clase abstracta para describir dicha clase).

Invalidar propiedades y métodos en clases derivadas

De forma predeterminada, una clase derivada hereda propiedades y métodos de su clase base. Si una propiedad o método heredado tiene que comportarse de forma diferente en la clase derivada, se puede invalidar. Es decir, puede definir una nueva implementación del método en la clase derivada. Los siguientes modificadores se utilizan para controlar cómo se reemplazan propiedades y métodos:

  • Overridable : permite que una propiedad o método de una clase se invalide en una clase derivada.

  • Overrides : invalida una Overridable propiedad o método definido en la clase base.

  • NotOverridable : impide que una propiedad o método se invalide en una clase heredada. De forma predeterminada, Public los métodos son NotOverridable .

  • MustOverride : requiere que una clase derivada invalide la propiedad o el método. Cuando se MustOverride usa la palabra clave , la definición del método consta solo de la instrucción , o Sub Function Property . No se permite ninguna otra instrucción y, en concreto, no hay ninguna End Sub End Function instrucción o . MustOverride Los métodos deben declararse en MustInherit clases .

Supongamos que desea definir clases para controlar las nóminas. Podría definir una clase genérica Payroll que contenga un método que RunPayroll calcule las nóminas de una semana típica. A continuación, podría usar como clase base para una clase más especializada, que podría usarse al distribuir las Payroll BonusPayroll pagas extra de los empleados.

La BonusPayroll clase puede heredar e invalidar el método PayEmployee definido en la clase Payroll base.

En el ejemplo siguiente se define una clase base y una clase derivada, , que Payroll, invalida un método BonusPayroll heredado, PayEmployee . Un procedimiento, , crea y, a continuación, pasa un objeto y un objeto a una RunPayroll Payroll BonusPayroll función, Pay , que ejecuta el método de ambos PayEmployee objetos.

Const BonusRate As Decimal = 1.45D
Const PayRate As Decimal = 14.75D

Class Payroll
    Overridable Function PayEmployee(
        ByVal HoursWorked As Decimal,
        ByVal PayRate As Decimal) As Decimal

        PayEmployee = HoursWorked * PayRate
    End Function
End Class

Class BonusPayroll
    Inherits Payroll
    Overrides Function PayEmployee(
        ByVal HoursWorked As Decimal,
        ByVal PayRate As Decimal) As Decimal

        ' The following code calls the original method in the base 
        ' class, and then modifies the returned value.
        PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) * BonusRate
    End Function
End Class

Sub RunPayroll()
    Dim PayrollItem As Payroll = New Payroll
    Dim BonusPayrollItem As New BonusPayroll
    Dim HoursWorked As Decimal = 40

    MsgBox("Normal pay is: " &
        PayrollItem.PayEmployee(HoursWorked, PayRate))
    MsgBox("Pay with bonus is: " &
        BonusPayrollItem.PayEmployee(HoursWorked, PayRate))
End Sub

La palabra clave MyBase

La palabra clave se comporta como una variable de objeto que hace referencia a MyBase la clase base de la instancia actual de una clase. MyBase se usa con frecuencia para tener acceso a los miembros de clase base que se invalidan o se sombrean en una clase derivada. En concreto, MyBase.New se usa para llamar explícitamente a un constructor de clase base desde un constructor de clase derivada.

Por ejemplo, supongamos que está diseñando una clase derivada que invalida un método heredado de la clase base. El método invalidado puede llamar al método en la clase base y modificar el valor devuelto como se muestra en el fragmento de código siguiente:

Class DerivedClass
    Inherits BaseClass
    Public Overrides Function CalculateShipping(
        ByVal Dist As Double,
        ByVal Rate As Double) As Double

        ' Call the method in the base class and modify the return value.
        Return MyBase.CalculateShipping(Dist, Rate) * 2
    End Function
End Class

En la lista siguiente se describen las restricciones sobre el uso de MyBase :

  • MyBase hace referencia a la clase base inmediata y a sus miembros heredados. No se puede usar para tener acceso a Private los miembros de la clase .

  • MyBase es una palabra clave, no un objeto real. MyBase no se puede asignar a una variable, pasar a procedimientos o usarse en una Is comparación.

  • El método que califica no tiene que definirse en la clase base inmediata; en su lugar, se puede definir en una MyBase clase base heredada indirectamente. Para que una referencia calificada por se compile correctamente, alguna clase base debe contener un método que coincida con el nombre y los tipos de parámetros que aparecen MyBase en la llamada.

  • No se puede usar MyBase para llamar a MustOverride métodos de clase base.

  • MyBase no se puede usar para calificarse a sí mismo. Por lo tanto, el código siguiente no es válido:

    MyBase.MyBase.BtnOK_Click()

  • MyBase no se puede usar en módulos.

  • MyBase no se puede usar para tener acceso a miembros de clase base marcados como Friend si la clase base se encontrara en un ensamblado diferente.

Para obtener más información y otro ejemplo, vea Cómo: Obteneracceso a una variable oculta por una clase derivada .

Palabra clave MyClass

La palabra clave se comporta como una variable de objeto que hace referencia a la instancia actual de una clase tal MyClass como se implementó originalmente. MyClasses similar a , pero todas las llamadas a métodos y propiedades en se tratan como si el método o Me MyClass la propiedad fuera NotOverríble. Por lo tanto, el método o la propiedad no se ve afectado por la invalidación en una clase derivada.

  • MyClass es una palabra clave, no un objeto real. MyClass no se puede asignar a una variable, pasar a procedimientos o usarse en una Is comparación.

  • MyClass hace referencia a la clase que contiene y a sus miembros heredados.

  • MyClass se puede usar como calificador para Shared los miembros.

  • MyClass no se puede usar dentro de un método, pero se puede usar dentro de un método Shared de instancia para tener acceso a un miembro compartido de una clase.

  • MyClass no se puede usar en módulos estándar.

  • MyClass se puede usar para calificar un método que se define en una clase base y que no tiene ninguna implementación del método proporcionado en esa clase. Esta referencia tiene el mismo significado que el MyBase. método.

En el ejemplo siguiente se Me comparan y MyClass .

Class baseClass
    Public Overridable Sub testMethod()
        MsgBox("Base class string")
    End Sub
    Public Sub useMe()
        ' The following call uses the calling class's method, even if
        ' that method is an override.
        Me.testMethod()
    End Sub
    Public Sub useMyClass()
        ' The following call uses this instance's method and not any
        ' override.
        MyClass.testMethod()
    End Sub
End Class
Class derivedClass : Inherits baseClass
    Public Overrides Sub testMethod()
        MsgBox("Derived class string")
    End Sub
End Class
Class testClasses
    Sub startHere()
        Dim testObj As derivedClass = New derivedClass()
        ' The following call displays "Derived class string".
        testObj.useMe()
        ' The following call displays "Base class string".
        testObj.useMyClass()
    End Sub
End Class

Aunque invalida , la palabra clave de anula los efectos de la invalidación y el compilador resuelve la llamada a la versión derivedClass de clase base de testMethod MyClass useMyClass testMethod .

Consulta también