Fundamentos de la herencia (Visual Basic)Inheritance Basics (Visual Basic)

El Inherits instrucción se utiliza para declarar una nueva clase denominada una clase derivada, basándose en una clase existente, conocida como un clase base.The Inherits statement is used to declare a new class, called a derived class, based on an existing class, known as a base class. Las clases derivadas heredan y pueden extender las propiedades, métodos, eventos, campos y constantes definidas en la clase base.Derived classes inherit, and can extend, the properties, methods, events, fields, and constants defined in the base class. La siguiente sección describe algunas de las reglas de herencia y los modificadores que se puede usar para cambiar las clases de manera heredan o se heredan:The following section describes some of the rules for inheritance, and the modifiers you can use to change the way classes inherit or are inherited:

  • De forma predeterminada, todas las clases son heredables a menos que marque con el NotInheritable palabra clave.By default, all classes are inheritable unless marked with the NotInheritable keyword. Las clases pueden heredar de otras clases en el proyecto o de clases en otros ensamblados que se hace referencia su proyecto.Classes can inherit from other classes in your project or from classes in other assemblies that your project references.

  • A diferencia de los lenguajes que permiten la herencia múltiple, Visual Basic permite la herencia única solo en las clases; es decir, las clases derivadas pueden tener sólo una clase base.Unlike languages that allow multiple inheritance, Visual Basic allows only single inheritance in classes; that is, derived classes can have only one base class. Aunque no se permite la herencia múltiple en las clases, las clases pueden implementar varias interfaces, que pueden conseguir los mismos extremos de manera eficaz.Although multiple inheritance is not allowed in classes, classes can implement multiple interfaces, which can effectively accomplish the same ends.

  • Para evitar la exposición de 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.To prevent exposing restricted items in a base class, the access type of a derived class must be equal to or more restrictive than its base class. Por ejemplo, un Public clase no puede heredar un Friend o un Private (clase) y un Friend clase no puede heredar un Private clase.For example, a Public class cannot inherit a Friend or a Private class, and a Friend class cannot inherit a Private class.

Modificadores de herenciaInheritance Modifiers

Visual Basic presenta las siguientes instrucciones de nivel de clase y los modificadores para admitir la herencia:Visual Basic introduces the following class-level statements and modifiers to support inheritance:

  • Inherits instrucción: especifica la clase base.Inherits statement — Specifies the base class.

  • NotInheritable modificador: evita que los programadores mediante la clase como clase base.NotInheritable modifier — Prevents programmers from using the class as a base class.

  • MustInherit modificador: Especifica que la clase está diseñada para su uso como clase base.MustInherit modifier — Specifies that the class is intended for use as a base class only. Las instancias de MustInherit clases no se pueden crear directamente; solo se pueden crear instancias de clase como base de una clase derivada.Instances of MustInherit classes cannot be created directly; they can only be created as base class instances of a derived class. (Otros lenguajes de programación, como C++ y C#, uso el término clase abstracta para describir esta clase.)(Other programming languages, such as C++ and C#, use the term abstract class to describe such a class.)

Reemplazar propiedades y métodos en clases derivadasOverriding Properties and Methods in Derived Classes

De forma predeterminada, una clase derivada hereda las propiedades y métodos de su clase base.By default, a derived class inherits properties and methods from its base class. Si tiene una propiedad o método heredado para comportarse de manera diferente en la clase derivada puede ser invalidar.If an inherited property or method has to behave differently in the derived class it can be overridden. Es decir, puede definir una nueva implementación del método en la clase derivada.That is, you can define a new implementation of the method in the derived class. Los siguientes modificadores se utilizan para controlar cómo se reemplazan propiedades y métodos:The following modifiers are used to control how properties and methods are overridden:

  • Overridable Permite una propiedad o método en una clase que se invalide en una clase derivada.Overridable — Allows a property or method in a class to be overridden in a derived class.

  • Overrides : Invalida un Overridable propiedad o método definido en la clase base.Overrides — Overrides an Overridable property or method defined in the base class.

  • NotOverridable : Impide que una propiedad o método que se invalida en una clase heredera.NotOverridable — Prevents a property or method from being overridden in an inheriting class. De forma predeterminada, Public métodos son NotOverridable.By default, Public methods are NotOverridable.

  • MustOverride : Requiere que una clase derivada invalide la propiedad o método.MustOverride — Requires that a derived class override the property or method. Cuando el MustOverride se usa la palabra clave, la definición del método consta de solamente el Sub, Function, o Property instrucción.When the MustOverride keyword is used, the method definition consists of just the Sub, Function, or Property statement. Se permite ninguna otra instrucción y, específicamente no hay ningún End Sub o End Function instrucción.No other statements are allowed, and specifically there is no End Sub or End Function statement. MustOverride los métodos deben declararse en MustInherit clases.MustOverride methods must be declared in MustInherit classes.

Suponga que desea definir clases para controlar la nómina.Suppose you want to define classes to handle payroll. Puede definir un tipo genérico Payroll clase que contiene un RunPayroll método que calcula la nómina de una semana típica.You could define a generic Payroll class that contains a RunPayroll method that calculates payroll for a typical week. Se podría utilizar Payroll como una clase base para un método más especializado BonusPayroll (clase), que podría usarse al distribuir las bonificaciones del empleado.You could then use Payroll as a base class for a more specialized BonusPayroll class, which could be used when distributing employee bonuses.

El BonusPayroll clase puede heredar y reemplazar, el PayEmployee método definido en la base de Payroll clase.The BonusPayroll class can inherit, and override, the PayEmployee method defined in the base Payroll class.

En el ejemplo siguiente se define una clase base, Payroll, y una clase derivada, BonusPayroll, que reemplaza un método heredado, PayEmployee.The following example defines a base class, Payroll, and a derived class, BonusPayroll, which overrides an inherited method, PayEmployee. Un procedimiento, RunPayroll, crea y, a continuación, pasa un Payroll objeto y un BonusPayroll objeto a una función, Pay, que se ejecuta el PayEmployee método de ambos objetos.A procedure, RunPayroll, creates and then passes a Payroll object and a BonusPayroll object to a function, Pay, that executes the PayEmployee method of both objects.

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 MyBaseThe MyBase Keyword

El MyBase palabra clave se comporta como una variable de objeto que hace referencia a la clase de la instancia actual de una clase base.The MyBase keyword behaves like an object variable that refers to the base class of the current instance of a class. MyBase se suele utilizar para tener acceso a miembros de clase base que se reemplazan o sombrean en una clase derivada.MyBase is frequently used to access base class members that are overridden or shadowed in a derived class. En concreto, MyBase.New se usa para llamar explícitamente a un constructor de clase base desde un constructor de clase derivada.In particular, MyBase.New is used to explicitly call a base class constructor from a derived class constructor.

Por ejemplo, suponga que está diseñando una clase derivada que reemplaza un método heredado de la clase base.For example, suppose you are designing a derived class that overrides a method inherited from the base class. El método invalidado puede llamar al método en la clase base y modificar el valor devuelto, tal como se muestra en el siguiente fragmento de código:The overridden method can call the method in the base class and modify the return value as shown in the following code fragment:

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

La siguiente lista describe las restricciones sobre el uso de MyBase:The following list describes restrictions on using MyBase:

  • MyBase hace referencia a la clase base inmediata y sus miembros heredados.MyBase refers to the immediate base class and its inherited members. No se puede utilizar para tener acceso a Private miembros de la clase.It cannot be used to access Private members in the class.

  • MyBase es una palabra clave, no un objeto real.MyBase is a keyword, not a real object. MyBase no se asigna a una variable, pasar a los procedimientos o usado en un Is comparación.MyBase cannot be assigned to a variable, passed to procedures, or used in an Is comparison.

  • El método que MyBase califica no tiene que definirse en la clase base inmediata; en su lugar puede definirse en una clase base heredada indirectamente.The method that MyBase qualifies does not have to be defined in the immediate base class; it may instead be defined in an indirectly inherited base class. En una referencia calificada por MyBase se compilen correctamente, alguna clase base debe contener un método que coincide con el nombre y los tipos de parámetros que aparecen en la llamada.In order for a reference qualified by MyBase to compile correctly, some base class must contain a method matching the name and types of parameters that appear in the call.

  • No puede usar MyBase para llamar a MustOverride los métodos de clase base.You cannot use MyBase to call MustOverride base class methods.

  • MyBase no se puede usar para calificar a sí mismo.MyBase cannot be used to qualify itself. Por lo tanto, no es válido el código siguiente:Therefore, the following code is not valid:

    MyBase.MyBase.BtnOK_Click()

  • MyBase no se puede usar en los módulos.MyBase cannot be used in modules.

  • MyBase no se puede usar para tener acceso a los miembros de clase base que están marcados como Friend si la clase base se encuentra en un ensamblado diferente.MyBase cannot be used to access base class members that are marked as Friend if the base class is in a different assembly.

Para obtener más información y otro ejemplo, vea Cómo: Obtener acceso a una Variable que oculta una clase derivada.For more information and another example, see How to: Access a Variable Hidden by a Derived Class.

La palabra clave MyClassThe MyClass Keyword

El MyClass palabra clave se comporta como una variable de objeto que hace referencia a la instancia actual de una clase como se implementaron originalmente.The MyClass keyword behaves like an object variable that refers to the current instance of a class as originally implemented. MyClass es similar a Me, pero llama cada método y propiedad en MyClass se tratan como si fuera el método o propiedad NotOverridable.MyClass resembles Me, but every method and property call on MyClass is treated as if the method or property were NotOverridable. Por lo tanto, el método o propiedad no se ve afectado por el reemplazo de una clase derivada.Therefore, the method or property is not affected by overriding in a derived class.

  • MyClass es una palabra clave, no un objeto real.MyClass is a keyword, not a real object. MyClass no se asigna a una variable, pasar a los procedimientos o usado en un Is comparación.MyClass cannot be assigned to a variable, passed to procedures, or used in an Is comparison.

  • MyClass hace referencia a la clase contenedora y sus miembros heredados.MyClass refers to the containing class and its inherited members.

  • MyClass se puede usar como un calificador para Shared miembros.MyClass can be used as a qualifier for Shared members.

  • MyClass no se puede usar dentro de un Shared método, pero puede utilizarse para tener acceso a un miembro compartido de una clase dentro de un método de instancia.MyClass cannot be used inside a Shared method, but can be used inside an instance method to access a shared member of a class.

  • MyClass no se puede usar en los módulos estándar.MyClass cannot be used in standard modules.

  • MyClass puede usarse 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.MyClass can be used to qualify a method that is defined in a base class and that has no implementation of the method provided in that class. Este tipo de referencia tiene el mismo significado que MyBase. método.Such a reference has the same meaning as MyBase.Method.

En el ejemplo siguiente se comparan Me y MyClass.The following example compares Me and 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 derivedClass invalida testMethod, MyClass palabra clave en useMyClass anula el efecto de reemplazo y el compilador se resuelve la llamada a la versión de la clase base testMethod.Even though derivedClass overrides testMethod, the MyClass keyword in useMyClass nullifies the effects of overriding, and the compiler resolves the call to the base class version of testMethod.

Vea tambiénSee also