Noções básicas de herança (Visual Basic)
The Inherits statement is used to declare a new class, called a derived class, based on an existing class, known as a base class. Classes derivadas herdam e podem estender, propriedades, métodos, eventos, campos e constantes definidas na classe base. A seção a seguir descreve algumas das regras de herança e os modificadores que você pode usar para alterar as classes de maneira herdam ou são herdados:
Por padrão, todas as classes são herdadas, a menos que marcados com o NotInheritable palavra-chave. Classes podem herdar a partir de outras classes em seu projeto ou classes em outros assemblies que faz referência a seu projeto .
Ao contrário das linguagens que permitem a herança múltipla, Visual Basic permite que somente herança única nas classes; ou seja, as classes derivadas podem ter apenas uma classe base. Embora a herança múltipla não é permitida em classes, classes podem implementar várias interfaces, efetivamente podem realizar as extremidades do mesmas.
Para evitar expor restritos de itens em uma classe base, o tipo de acesso de uma classe de derivado deve ser igual ou mais restritivas do que sua classe base. Por exemplo, um Public classe não pode herdar uma Friend ou um Private classee um Friend classe não pode herdar uma Private classe.
Modificadores de herança
Visual Basicapresenta a seguinte classe-nível de instruções e modificadores de herança de suporte:
Inherits demonstrativo — Especifica a classe base.
NotInheritablemodificador — impede que os programadores usando a classe como uma classe base.
MustInheritmodificador — Especifica que a classe é destinado ao uso como um classe base somente. Instâncias de MustInherit classes não podem ser criadas diretamente; eles só podem ser criados como instâncias de classe base de uma classede derivada. (Outras linguagens de programação, como C++ e C#, usem o termo abstrata classe para descrever essa classe.)
Sobrescrevendo Propriedades e métodos em Classes derivadas
Por padrão, uma classe de derivada herda propriedades e métodos da sua classe base. Se um método ou propriedade herdada de tiver se comportem de forma diferente na classe derivada pode ser substituído. Ou seja, você pode definir uma nova implementação do método na classederivada. Seguintes modificadores são usados para controlar como os métodos e propriedades são ignorados:
Overridable— Permite que uma propriedade ou método em uma classe para ser substituído em uma classede derivada.
Overrides— Substitui uma Overridabledepropriedade ou método definido na classe base.
NotOverridable— Impede uma propriedade ou método que está sendo substituído em uma classe. Por padrão, Public métodos são NotOverridable.
MustOverride— Requer que um derivado classesubstituir o métodoou propriedade . Quando o MustOverride palavra-chave é usada, a definição do método consiste apenas o Sub, Function, ou Property demonstrativo. Não são permitidas a outras instruções e especificamente, há nenhum End Sub ou End Function demonstrativo. MustOverrideos métodos devem ser declarados em MustInherit classes.
Suppose you want to define classes to handle payroll. You could define a generic Payroll class that contains a RunPayroll method that calculates payroll for a typical week. You could then use Payroll as a base class for a more specialized BonusPayroll class, which could be used when distributing employee bonuses.
The BonusPayroll class can inherit, and override, the PayEmployee method defined in the base Payroll class.
The following example defines a base class, Payroll, and a derived class, BonusPayroll, which overrides an inherited method, PayEmployee. 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
A palavra-chave MyBase
O MyBasepalavra-chave se comporta como umavariável de objetoque se refere à classe base da instância atual de uma classe. MyBaseé freqüentemente usado para acessar membros de classe base que são substituídos ou sombreados em uma classede derivada. In particular, MyBase.New is used to explicitly call a base class constructor from a derived class constructor.
Por exemplo, suponha que você está criando uma classe derivada que substitui um método herdado da classe base. O método substituído pode chamar o método na classe base e modifique o valor retornado , conforme mostrado no fragmento de código a seguir:
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
A lista a seguir descreve as restrições sobre o uso de MyBase:
MyBaserefere-se à imediata classe base e seus membros herdados. Não pode ser usada para acesso Private os membros da classe.
MyBaseé uma palavra-chave, não um real objeto. MyBasenão é atribuído a uma variável, passados para procedimentos ou usado em um Is comparação.
O método que MyBase qualifica não devem ser definidos na imediata classe base; em vez disso, podem ser definido de uma classe basede indiretamente herdada. Para que uma referência qualificada pela MyBase para compilar corretamente, alguns classe base deve conter um método de correspondência, o nome e tipos de parâmetros que aparecem na chamada.
Não é possível usar MyBase para chamar MustOverride classe base métodos.
MyBasenão pode ser usado para qualificar a mesmo. Portanto, o código a seguir não é válido:
MyBase.MyBase.BtnOK_Click()
MyBasenão pode ser usado em módulos.
MyBasenão pode ser usado para acessar membros de classe base são marcados como Friend se a classe base estiver em um diferente do assembly.
Para obter mais informações e o outro exemplo, consulte Como: Acessar uma variável ocultada por uma classe derivada (Visual Basic).
A palavra-chave MyClass
O MyClasspalavra-chave se comporta como umavariável de objetoque se refere à instância atual de uma classe como originalmente implementados. MyClasssemelhante a Me, mas cada método e propriedade chamar em MyClass é tratado como se o método ou propriedade foram NotOverridable (Visual Basic). Therefore, the method or property is not affected by overriding in a derived class.
MyClassé uma palavra-chave, não um real objeto. MyClassnão é atribuído a uma variável, passados para procedimentos ou usado em um Is comparação.
MyClassrefere-se para a classe e seus membros herdados.
MyClasspode ser usado como um qualificador de Shared membros.
MyClassnão pode ser usado dentro de um Sharedmétodo, mas pode ser usado para acessar um membro compartilhado de uma classedentro de um método de instância.
MyClassnão pode ser usado em módulos padrão.
MyClasspode ser usado para qualificar um método que é definido em uma classe base e que não tem implementação do método fornecido nessa classe. Tal referência tem o mesmo significado que MyBase.método.
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
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.