VB.NET -  Compreendendo Properties

 

Ultimamente ouve-se falar muito sobre Orientação a Objetos ; podemos dizer que a programação orientada a objetos 'esta na moda'  e é fácil perceber isto pela quantidade de artigos, livros a respeito do assunto. Para quem já trabalhava com o Visual Basic a orientação a objetos não deve ser uma novidade.

 

A linguagem oferecia muitos recursos presentes em linguagens 'puramente' orientada a objetos ;  com a chegada do VB.NET o que faltava foi completado e temos agora uma verdadeira linguagem orientada a objetos. Isto é muito bom , mas continuar usando a linguagem sem usar os recursos que ela oferece e sem compreender o que mudou não acrescenta nada à sua experiência. Por este motivo gosto de publicar artigos abordando assuntos relativos a conceitos sobre orientação a objetos.

 

Hoje vou falar de Propriedades (properties). Para acompanhar este artigo sugiro que você leia os artigos que já publiquei com conceitos sobre OOP :

 

Todos os objetos possuem atributos que são usados para definir e retornar o estado do objeto. Estes atributos são propriedades que muitas vezes você configura usando o mouse ; na verdade cada objeto expõe um conjunto específico de propriedades . Vou usar aqui o exemplo citado no artigo - NET -  UML - objetos e classes  - onde criei um objeto para representar meu cachorro Bilu.
 

O objeto cachorro possuía certas propriedades que são comuns a todos os cachorros, estas propriedades incluíam atributos como nome , cor , altura ,tamanho , peso, etc. Todos os cachorros possuem estas propriedades , embora para diferentes cachorros os valores das propriedades sejam diferentes.

 

Vamos então criar uma classe para o nosso objeto cachorro:

 

Public Class Cachorro

    Public altura As Integer
    Public nome As String
    Public tamanho As Integer
    Public cor As String
 
    Public  Sub New()
        nome="Bilu"
        cor= "Marrom"
    End Sub
 
    
    Public  Sub New(ByVal alt As Integer, ByVal nome As String , _ 
ByVal tam As Integer, ByVal cores As String)
	
        altura = alt
        tamanho = tam
        cor= cores
    End Sub
 

    Public  Sub latir()
	Console.Writeline("Au , au, au, au, ...")
    End Sub

    
    
    Public  Sub comer()
	Console.Writeline(" Nham, Nham, grrrr....")
    End Sub
 

End Class

 

A classe Cachorro possui :

4 propriedades : altura ,nome, tamanho e cor

2 construtores : Um vazio e outro onde podemos definir a altura, nome, tamanho e cor

- Public  Sub New()

- Public  Sub New(ByVal alt As Integer, ByVal tam As Integer, ByVal cores As String)

2 Métodos :  latir() e comer()

Obs:
Eu uso a notação padrão usada no Java para dar nome a classes e métodos:  Classes sempre começam com letra em caixa alta e métodos em caixa baixa.

   

 

Como você já deve saber , para eu usar a classe devo instanciar um objeto da classe Cachorro. Vamos fazer isto e em seguida atribuir um valor a propriedade nome e à propriedade Cor

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim c As New Cachorro

        c.nome = "Bob"
        c.cor = "Branco"
     MsgBox("Cachorro = " & c.nome & vbCrLf & " Cor = " & c.cor)
 
End Sub

Instanciei um objeto da classe Cachorro e em seguida atribui o valor Bob ao nome e Branco a cor.

Você percebeu que eu alterei o valor da propriedade nome , da classe Cachorro ? 

Observe que no construtor , sem atributos da classe , eu estou definindo o nome como Bilu e a cor como Marrom.

Quando eu executar este projeto o objeto c será criado , o construtor da classe Cachorro será executado atribuindo o nome Bilu e a cor Marrom , mas , em seguida o código irá alterar estes valores para Bob e Branco.

Os valores que serão exibidos na caixa de mensagem são:

Como as variáveis que definem as propriedades foram definidas como do tipo Public elas são acessíveis por qualquer programa fora da classe Cachorro. Basta instanciar um objeto da classe e pronto.

Este é um efeito altamente indesejável , pois desta forma qualquer poderia alterar os valores das variáveis da minha classe , e eu posso não querer que isto aconteça .

Se você pensou em definir como Private as variáveis e assim resolver o problema , há um pequeno problema : fazendo assim você não terá acesso as variáveis.

O que eu posso fazer para evitar que isto aconteça ?

Simples , criando propriedades.  Vamos ver como fica...???

Vou criar duas propriedades : nomeCachorro e corCachorro

A propriedade corCachorro eu desejo que possa ser acessada e alterada

A propriedade nomeCachorro eu não desejo que possa ser alterada. Vou atribuir um valor a propriedade na classe e ela não pode permitir a alteração.

Veja o código as duas propriedades abaixo:( O código deverá ser incluído na classe Cachorro)

    Public Property corCachorro() As String
        Get
            Return cor
        End Get
        Set(ByVal Value As String)
            cor = Value
        End Set
    End Property
    Public ReadOnly Property nomeCachorro() As String
        Get
            Return nome
        End Get
    End Property

 

Para poder realizar estas alterações deveremos alterar o tipo de acesso das variáveis cor e nome para Private. O código completo da classe ficaria assim :

Public Class Cachorro

    Public altura As Integer
    Private nome As String
    Public tamanho As Integer
    Private cor As String
 
    Public  Sub New()
        nome="Bilu"

    
    End Sub
 
    
    Public  Sub New(ByVal alt As Integer, ByVal nome As String , ByVal tam As Integer, ByVal cores As String)
	
        altura = alt
        tamanho = tam
        cor= cores
    End Sub
 

    Public  Sub latir()
	Console.Writeline("Au , au, au, au, ...")
    End Sub

    
    
    Public  Sub comer()
	Console.Writeline(" Nham, Nham, grrrr....")
    End Sub

     Public Property corCachorro() As String
        Get
            Return cor
        End Get
        Set(ByVal Value As String)
            cor = Value
        End Set
    End Property
    Public ReadOnly Property nomeCachorro() As String
        Get
            Return nome
        End Get
    End Property
 

End Class

 

Agora as coisas mudaram. O que mudou ???

As variáveis nome e cor são Private e não podem ser acessadas diretamente. O acesso aos valores destas variáveis agora é feito pelas Propriedades nomeCachorro e corCachorro.

A propriedade nomeCachorro é do tipo Public e possui um Get a partir do qual obtemos o valor da variável e um Set a partir do qual podemos atribuir valores a variável cor.

A propriedade nomeCachorro e do tipo Public mas ReadOnly , ou seja , somente leitura. Logo ela não possui um Set mas somente o Get pois eu só posso ler o valor da variável atribuida na classe Cachorro.

Com isto concluímos que propriedades são variáveis especiais que permitem encapsular o código da minha classe.

Geralmente as propriedades possuem os procedimentos Get e Set mas podemos usar os modificadores :

Agora somente a variável cor pode ser acessada e alterada , a variável nome não pode ser acessada pois a propriedade nomeCachorro embora seja do tipo Public é somente leitura.(ReadOnly)

Você pode também incluir um código de validação na propriedade e permitir a alteração somente com base em alguns critérios. Por exemplo podemos criar a propriedade alturaCachorro que define o valor da altura de um cachorro e permitir que ela seja alterada somente para valores menores que 10 . Veja como fica o código :

    Public Property alturaCachorro() As Integer
        Get
            Return altura
        End Get
        Set(ByVal Value As Integer)
            If altura < 10 Then
                altura = Value
            End If
        End Set
    End Property

Espero que o conceito de Propriedades tenha ficado claro para você pois ele é um dos fundamentos da OOP.

Até mais ver ...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti