Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A Inherits instrução é usada para declarar uma nova classe, chamada de classe derivada, com base em uma classe existente, conhecida como classe base. As classes derivadas herdam e podem estender as propriedades, métodos, eventos, campos e constantes definidos na classe base. A seção a seguir descreve algumas das regras de herança e os modificadores que você pode usar para alterar a maneira como as classes herdam ou são herdadas:
Por padrão, todas as classes são herdáveis, a menos que marcadas com a
NotInheritablepalavra-chave. As classes podem herdar de outras classes em seu projeto ou de classes em outros assemblies que seu projeto referencia.Ao contrário das linguagens que permitem herança múltipla, o Visual Basic permite apenas uma única herança em classes; ou seja, as classes derivadas podem ter apenas uma classe base. Embora a herança múltipla não seja permitida em classes, as classes podem implementar várias interfaces, que podem efetivamente realizar os mesmos fins.
Para evitar a exposição de itens restritos em uma classe base, o tipo de acesso de uma classe derivada deve ser igual ou mais restritivo do que sua classe base. Por exemplo, uma
Publicclasse não pode herdar umaFriendou umaPrivateclasse, e umaFriendclasse não pode herdar umaPrivateclasse.
Modificadores de herança
Visual Basic apresenta as seguintes instruções de nível de classe e modificadores para dar suporte à herança:
Inheritsstatement — Especifica a classe base.NotInheritablemodificador — Impede que os programadores usem a classe como uma classe base.MustInheritmodifier — Especifica que a classe se destina a ser usada apenas como uma classe base. Instâncias deMustInheritclasses não podem ser criadas diretamente, elas só podem ser criadas como instâncias de classe base de uma classe derivada. (Outras linguagens de programação, como C++ e C#, usam o termo classe abstrata para descrever tal classe.)
Substituindo propriedades e métodos em classes derivadas
Por padrão, uma classe derivada herda propriedades e métodos de sua classe base. Se uma propriedade herdada ou um método tiver que se comportar de forma diferente na classe derivada, ele pode ser substituído. Ou seja, você pode definir uma nova implementação do método na classe derivada. Os modificadores a seguir são usados para controlar como as propriedades e os métodos são substituídos:
Overridable— Permite que uma propriedade ou método em uma classe seja substituído em uma classe derivada.Overrides— Substitui umaOverridablepropriedade ou método definido na classe base.NotOverridable— Impede que uma propriedade ou método seja substituído em uma classe herdeira. Por padrão,Publicos métodos sãoNotOverridable.MustOverride— Requer que uma classe derivada substitua a propriedade ou o método. Quando aMustOverridepalavra-chave é usada, a definição do método consiste apenas naSubinstrução ,Function, ouProperty. Nenhuma outra declaração é permitida e, especificamente, não há nenhumaEnd SubEnd Functiondeclaração.MustOverrideos métodos devem ser declarados nasMustInheritclasses.
Suponha que você queira definir classes para lidar com a folha de pagamento. Você pode definir uma classe genérica Payroll que contém um RunPayroll método que calcula a folha de pagamento para uma semana típica. Você poderia então usar Payroll como uma classe base para uma classe mais especializada BonusPayroll , que poderia ser usada na distribuição de bônus de funcionários.
A BonusPayroll classe pode herdar e substituir o PayEmployee método definido na classe base Payroll .
O exemplo a seguir define uma classe base, Payroll, e uma classe derivada, BonusPayroll, que substitui um método herdado, PayEmployee. Um procedimento, , cria e, em seguida, RunPayrollpassa um Payroll objeto e um BonusPayroll objeto para uma função, Pay, que executa o PayEmployee método de ambos os 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
A palavra-chave MyBase
A MyBase palavra-chave se comporta como uma variável de objeto que se refere à classe base da instância atual de uma classe.
MyBase é freqüentemente usado para acessar membros da classe base que são substituídos ou sombreados em uma classe derivada. Em particular, MyBase.New é usado para chamar explicitamente um construtor de classe base de um construtor de classe derivada.
Por exemplo, suponha que você esteja 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 modificar o valor de retorno conforme mostrado no seguinte fragmento de código:
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 de uso MyBasedo :
MyBaserefere-se à classe base imediata e seus membros herdados. Ele não pode ser usado para acessarPrivatemembros na classe.MyBaseé uma palavra-chave, não um objeto real.MyBasenão pode ser atribuído a uma variável, passado para procedimentos ou usado em umaIscomparação.O método que
MyBasequalifica não precisa ser definido na classe base imediata, mas pode ser definido em uma classe base herdada indiretamente. Para que uma referência qualificada porMyBaseseja compilada corretamente, alguma classe base deve conter um método correspondente ao nome e aos tipos de parâmetros que aparecem na chamada.Você não pode usar
MyBasepara chamarMustOverridemétodos de classe base.MyBasenão pode ser utilizado para se qualificar. 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 da classe base marcados comoFriendse a classe base estivesse em um assembly diferente.
Para obter mais informações e outro exemplo, consulte Como acessar uma variável oculta por uma classe derivada.
A palavra-chave MyClass
A MyClass palavra-chave se comporta como uma variável de objeto que se refere à instância atual de uma classe conforme originalmente implementada.
MyClass semelhante a Me, mas cada chamada de método e propriedade é MyClass tratada como se o método ou propriedade fosse NotOverridable. Portanto, o método ou propriedade não é afetado pela substituição em uma classe derivada.
MyClassé uma palavra-chave, não um objeto real.MyClassnão pode ser atribuído a uma variável, passado para procedimentos ou usado em umaIscomparação.MyClassrefere-se à classe que contém e seus membros herdados.MyClasspode ser usado como qualificador paraSharedmembros.MyClassnão pode ser usado dentro de umSharedmétodo, mas pode ser usado dentro de um método de instância para acessar um membro compartilhado de uma classe.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 significadoMyBase.que Método.
O exemplo a seguir compara e MeMyClass.
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
Mesmo que derivedClass substitua testMethod, a MyClass palavra-chave in useMyClass anula os efeitos da substituição, e o compilador resolve a chamada para a versão de classe base do testMethod.