Programação orientada a objeto (Visual Basic)
O C# dá suporte completo à programação orientada a objeto, incluindo encapsulamento, herança e polimorfismo.
Encapsulamento significa que um grupo de propriedades, métodos e outros membros relacionados é tratado como uma única unidade ou objeto.
Herança descreve a capacidade de criar novas classes com base em uma classe existente.
Polimorfismo significa que você pode ter várias classes que podem ser usadas de forma intercambiável, ainda que cada classe implemente as mesmas propriedades ou métodos de maneiras diferentes.
Esta seção descreve os seguintes conceitos:
Classes e objetos
Os termos classe e objeto às vezes são usados de forma intercambiável, mas, na verdade, as classes descrevem o tipo dos objetos, enquanto os objetos são instâncias utilizáveis das classes. Sendo assim, o ato de criar um objeto é chamado de instanciação. Usando a analogia da uma planta, uma classe é a planta e um objeto é a construção feita com base naquela planta.
Para definir uma classe:
Class SampleClass
End Class
O C# também oferece uma versão leve das classes chamada de estruturas, que são úteis quando você precisa criar uma matriz grande de objetos e não quer consumir muita memória para isso.
Para definir uma estrutura:
Structure SampleStructure
End Structure
Para obter mais informações, consulte:
Membros de classe
Cada classe tem diferentes membros de classe que incluem propriedades que descrevem dados da classe, métodos que definem o comportamento da classe e eventos que fornecem comunicação entre diferentes classes e objetos.
Propriedades e campos
Os campos e as propriedades representam as informações que um objeto contém. Os campos são como variáveis, porque podem ser lidos ou definidos de forma direta.
Para definir um campo:
Class SampleClass
Public SampleField As String
End Class
As propriedades têm procedimentos de obter e definir, que oferecem mais controle sobre como os valores são definidos ou retornados.
O Visual Basic permite que você crie um campo privado para armazenar o valor da propriedade ou use as chamadas propriedades implementadas automaticamente que criam esse campo automaticamente nos bastidores e fornecem a lógica básica para os procedimentos de propriedade.
Para definir uma propriedade implementada automaticamente:
Class SampleClass
Public Property SampleProperty as String
End Class
Se você precisar executar operações adicionais para ler e gravar o valor da propriedade, defina um campo para armazenar o valor da propriedade e forneça a lógica básica para armazenar e recuperá-la:
Class SampleClass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
A maioria das propriedades têm métodos ou procedimentos para definir e obter o valor da propriedade. No entanto, você pode criar propriedades somente leitura ou somente gravação para impedir que elas sejam modificadas ou lidas. No Visual Basic, você pode usar ReadOnly
e WriteOnly
palavras-chave. No entanto, as propriedades implementadas automaticamente não podem ser somente leitura ou somente gravação.
Para saber mais, veja:
Métodos
Um método é uma ação que um objeto pode executar.
Observação
No Visual Basic, há duas maneiras de criar um método: a Sub
instrução será usada se o método não retornar um valor; a Function
instrução será usada se um método retornar um valor.
Para definir um método de uma classe:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
Uma classe pode ter várias implementações ou sobrecargas, do mesmo método que diferem quanto ao número de parâmetros ou tipos de parâmetro.
Para sobrecarregar um método:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Na maioria dos casos, você declara um método dentro de uma definição de classe. No entanto, o C# também dá suporte a métodos de extensão que permitem adicionar métodos a uma classe existente fora da definição real da classe.
Para obter mais informações, consulte:
Construtores
Construtores são métodos de classe que são executados automaticamente quando um objeto de um determinado tipo é criado. Os construtores normalmente inicializam os membros de dados do novo objeto. Um construtor pode ser executado apenas uma vez quando uma classe é criada. Além disso, o código no construtor sempre é executado antes de qualquer outro código em uma classe. No entanto, é possível criar várias sobrecargas de construtor da mesma forma que é feita para qualquer outro método.
Para definir um construtor para uma classe:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
Para obter mais informações, confira Tempo de vida do objeto: como os objetos são criados e destruídos.
Destruidores
Destruidores são usados para destruir instâncias de classes. No .NET Framework, o coletor de lixo gerencia automaticamente a alocação e a liberação de memória para os objetos gerenciados em seu aplicativo. No entanto, talvez ainda seja necessário usar os destruidores para limpar recursos não gerenciados que seu aplicativo criar. Pode haver apenas um destruidor para uma classe.
Para obter mais informações sobre os destruidores e a coleta de lixo no .NET Framework, consulte Coleta de lixo.
Eventos
Eventos permitem que uma classe ou objeto notifique outras classes ou objetos quando algo interessante ocorrer. A classe que envia (ou aciona) o evento é chamada de editor e as classes que recebem (ou manipulam) os eventos são chamadas assinantes. Para obter mais informações sobre os eventos e como eles são gerados e manipulados, consulte Eventos.
Para declarar eventos, use a Instrução event.
Para gerar eventos, use a Instrução RaiseEvent.
Para especificar manipuladores de eventos usando uma maneira declarativa, use a instrução WithEvents e a cláusula Handles.
Para poder adicionar, remover e alterar dinamicamente o manipulador de eventos associado a um evento, use a Instrução AddHandler e a Instrução RemoveHandler junto com o Operador AddressOf.
Classes aninhadas
Uma classe definida dentro de outra classe é chamada de aninhada. Por padrão, a classe aninhada é particular.
Class Container
Class Nested
' Add code here.
End Class
End Class
Para criar uma instância da classe aninhada, use o nome da classe de contêiner seguido pelo ponto e, em seguida, seguido pelo nome da classe aninhada:
Dim nestedInstance As Container.Nested = New Container.Nested()
Modificadores de acesso e níveis de acesso
Todas as classes e membros de classe podem especificar o nível de acesso que fornecem a outras classes usando modificadores de acesso.
Os modificadores de acesso a seguir estão disponíveis:
Modificador do Visual Basic | Definição |
---|---|
Público | O tipo ou membro pode ser acessado por qualquer outro código no mesmo assembly ou em outro assembly que faz referência a ele. |
Privado | O tipo ou membro pode ser acessado somente pelo código na mesma classe. |
Protegido | O tipo ou membro pode ser acessado somente pelo código na mesma classe ou em uma classe derivada. |
Friend | O tipo ou membro pode ser acessado por qualquer código no mesmo assembly, mas não de outro assembly. |
Protected Friend |
O tipo ou membro pode ser acessado por qualquer código no mesmo assembly ou por qualquer classe derivada em outro assembly. |
Para obter mais informações, consulte Níveis de acesso no Visual Basic.
Instanciando classes
Para criar um objeto, você precisa instanciar uma classe ou criar uma instância da classe.
Dim sampleObject as New SampleClass()
Após instanciar uma classe, você pode atribuir valores às propriedades e campos da instância e invocar métodos da classe.
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
Para atribuir valores a propriedades durante o processo de instanciação de classe, use os inicializadores de objeto:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
Para obter mais informações, consulte:
Classes e membros compartilhados
Um membro estático da classe é uma propriedade, procedimento ou campo que é compartilhado por todas as instâncias de uma classe.
Para definir um membro compartilhado:
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
Para acessar o membro estático, use o nome da classe sem criar um objeto dessa classe:
MsgBox(SampleClass.SampleString)
Os módulos compartilhados no Visual Basic têm apenas membros compartilhados e não podem ser instanciados. Membros estáticos também não podem acessar propriedades, métodos ou campos não estáticos
Para obter mais informações, consulte:
Tipos anônimos
Os tipos anônimos permitem criar objetos sem escrever uma definição de classe para o tipo de dados. Em vez disso, o compilador gera uma classe para você. A classe não tem nenhum nome utilizável e contém as propriedades que você especificar ao declarar o objeto.
Para criar uma instância de um tipo anônimo:
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
Para obter mais informações, consulte Tipos Anônimos.
Herança
A herança permite que você crie uma nova classe que reutiliza, estende e modifica o comportamento definido em outras classes. A classe cujos membros são herdados é chamada classe base e a classe que herda esses membros é chamada classe derivada. No entanto, todas as classes em C# herdam implicitamente da classe Object que dá suporte à hierarquia de classes do .NET e fornece serviços de nível baixo para todas as classes.
Observação
O Visual Basic não dá suporte a várias heranças. Ou seja, você pode especificar apenas uma classe base para uma classe derivada.
Para herdar de uma classe base:
Class DerivedClass
Inherits BaseClass
End Class
Por padrão, todas as classes podem ser herdadas. No entanto, é possível especificar se uma classe não deve ser usada como classe base ou criar uma classe que possa ser usada apenas como classe base.
Para especificar que uma classe não pode ser usada como classe base:
NotInheritable Class SampleClass
End Class
Para especificar que uma classe pode ser usada apenas como classe base e não pode ser instanciada:
MustInherit Class BaseClass
End Class
Para obter mais informações, consulte:
Substituindo membros
Por padrão, uma classe derivada herda todos os membros de sua classe base. Se quiser alterar o comportamento do membro herdado, você precisa substituí-la. Ou seja, você pode definir uma nova implementação de método, propriedade ou evento na classe derivada.
Os seguintes modificadores são usados para controlar como as propriedades e métodos são substituídos:
Modificador do Visual Basic | Definição |
---|---|
Substituível | Permite que um membro de classe seja substituído em uma classe derivada. |
Substituições | Substitui um membro virtual (substituível) definido na classe base. |
NotOverridable | Impede que um membro seja substituído em uma classe herdada. |
MustOverride | Requer que um membro de classe seja substituído na classe derivada. |
Sombras | Oculta um membro herdado de uma classe base |
Interfaces
Interfaces, como classes, definem um conjunto de propriedades, métodos e eventos. Mas, diferente das classes, as interfaces não fornecem implementação. Elas são implementadas por classes e definidas como entidades separadas das classes. Uma interface representa um contrato, no sentido em que uma classe que implementa uma interface deve implementar todos os aspectos da interface exatamente como ela está definida.
Para definir uma interface:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
Para implementar uma interface em uma classe:
Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
Para obter mais informações, consulte:
Genéricos
Classes, estruturas, interfaces e métodos do .NET Framework podem incluir parâmetros de tipo que definem tipos de objetos que podem armazenar ou usar. O exemplo mais comum dos genéricos é uma coleção, em que você pode especificar o tipo dos objeto a serem armazenados em uma coleção.
Para definir uma classe genérica:
Class SampleGeneric(Of T)
Public Field As T
End Class
Para criar uma instância de uma classe genérica:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
Para obter mais informações, consulte:
Delegados
Um delegado é um tipo que define uma assinatura de método e pode fornecer uma referência a qualquer método com uma assinatura compatível. Você pode invocar (ou chamar) o método através do delegado. Delegados são usados para passar métodos como argumentos a outros métodos.
Observação
Os manipuladores de eventos nada mais são do que métodos chamados por meio de delegados. Para obter mais informações sobre como usar delegados na manipulação de eventos, consulte Eventos.
Para criar um delegado:
Delegate Sub SampleDelegate(ByVal str As String)
Para criar uma referência a um método que corresponde à assinatura especificada pelo delegado:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
Para obter mais informações, consulte: