POO-F-03-Criação de Objetos | POO-F-05-Métodos |
Uma classe é um novo tipo de dados que pode ser definido pelo programador para descrever uma entidade real ou abstrata. Podemos entendê-las como um modelo ou como uma especificação para objetos de um tipo determinado, ou seja, descrevem de maneira genérica os elementos pertencentes a um dado conjunto.
Em um programa, as classes representam os conceitos fundamentais da aplicação em termos da realidade 'modelada' por tais classes [9]. Para a programação, criar classes envolve dois aspectos essenciais: a modelagem dos objetos a serem representados e a implementação deste modelo.
Modelar uma classe é determinar uma descrição adequada e geral para o conjunto de objetos que desejamos representar, ou seja, para todas as sua ocorrências.
Uma bola qualquer, cuja forma seja esférica, pode ser descrita por seu tamanho, cor, peso, material etc. Um modelo de bola, destinado a uma loja de materiais esportivos, talvez necessite incorporar outras características ao modelo da bola, agora vista como um produto. Já um clube que deseja controlar o empréstimo de seu material recreativo pode exibir diferentes necessidades. Assim, o mesmo tipo de objeto pode ser descrito de maneiras diferentes, conforme a aplicação do modelo, revelando a maior dificuldade desta tarefa: estabelecer modelos apropriados para as aplicações pretendidas e não apenas para descrever os objetos modelados.
As características que descrevem os objetos de uma classe são chamadas de atributos. Alguns atributos descrevem a aparência (o "ser") de um objeto, como sua cor, dimensões, peso etc.); enquanto outras representam estados (o "estar"). Uma lâmpada comum opera numa voltagem particular, com uma potência máxima, estando acesa ou apagada. Por exemplo, a lâmpada é 110V e é 40W e está apagada.
Uma classe Lampada pode ser declarada em Java ou C# como:
class Lampada {
double voltagem;
double potencia;
}
Cada atributo (ou campo) é como uma variável que faz parte da classe, por isso a outra denominação técnica de variável-membro, cuja sintaxe é:
class <NomeClasse> {
[acesso] <tipo> <nomeMembro> [ = <exprTipo>];
}
Onde:
- NomeClasse é o nome da classe;
- acesso é o especificador de acesso opcional;
- tipo é o nome do tipo deste membro;
- nomeMembro é o nome deste membro; e
- exprTipo é uma expressão que resulta num valor do tipo que pode inicializar o membro.
Os especificadores de acesso serão vistos na lição sobre encapsulamento.
Os membros de uma classe, no caso os seus atributos, podem armazenar valores para cada objeto existente. Desta maneira, para usar os atributos, devemos ter objetos.
Um objeto da classe Lampada pode ser criado com:
Lampada lamp1 = new Lampada();
O operador '.', denominado seletor, permite selecionar um membro de um objeto para ser utilizado. Assim podemos atribuir valores a atributos de um objeto com:
lamp1.voltagem = 110;
lamp1.potencia = 40;
De maneira análoga ao uso de variáveis, atributos de objetos podem ser usados em expressões ou exibidos para o usuário:
// Java ou C#
double corrente = lamp1.potencia / lamp1.voltagem;
// Java
System.out.println("Voltagem = " + lamp1.voltagem);
// C#
Console.write("Potencia = " + lamp1.potencia);
Outro objeto da classe Lampada pode ser criado com:
Lampada lamp2 = new Lampada();
E com ele podemos fazer:
lamp2.potencia = 100;
lamp2.voltagem = 220;
Ao atribuir valores aos campos do objeto lamp2, tais dados ficam armazenados na área de memória reservada para o objeto lamp2, não interferindo nos dados retidos pelo objeto lamp1. Pois cada objeto tem sua própria memória, permitindo guardar dados distintos dos demais objetos do seu tipo ou de outros.
Devemos observar que muitos objetos não podem ser descritos adequadamente apenas por seus atributos, requerendo também que suas ações, ou seja, suas capacidades sejam representadas. Uma classe incorpora o conceito de tipo abstrato de dados, definindo tanto conjunto de valores que representam este tipo como também o conjunto de operações sobre tais valores [10].
Por exemplo, um modelo de automóvel, para um simulador ou para um jogo, deve ser capaz de acelerar, frear e virar, ou seja, o modelo deve ser capaz de representar as ações dos objetos sob a forma de operações. Temos, portanto, que a modelagem de uma classe de objetos envolve a definição de atributos (que conterão os dados que descreverão sua aparência e estado -- esta lição) e de operações (que podem ser realizadas com tais atributos ou outros dados fornecidos -- a próxima lição), como ilustrado a seguir.
Cada classe define os atributos que seus objeto possuirão, de maneira que cada um destes possam ter valores distintos para cada um destes atributos, mesmo que tais valores sejam iguais (tal como dois objetos idênticos). A classe também define um conjunto único de operações para todos os objetos, ou seja, as ações realizadas serão as mesmas quanto à natureza, variando apenas em relação ao valor dos atributos de cada objeto. Esse é o assunto da próxima lição!
POO-F-03-Criação de Objetos | POO-F-05-Métodos |
Referências Bibliográficas
[1] JAMSA, K.; KLANDER, L.. Programando em C/C++: a bíblia. São Paulo: Makron Books, 1999.
[2] PAGE_JONES, M.. Fundamentos do Desenho Orientado a Objeto com UML. São Paulo: Makron Books, 2001.
[3] SOMMERVILLE, I.. Software Engineering. 6th. Ed. Harlow: Pearson, 2001.
[4] DEITEL, H.M.; DEITEL, P.J.. Java: como programar. 6a. Ed. São Paulo: Pearson Prentice-Hall, 2005.
[5] SAVITCH, W.. C++ Absoluto. São Paulo: Pearson Addison-Wesley, 2004.
[6] JANDL JR., P. Introdução ao C++. São Paulo: Futura, 2003.
[7] JANDL JR., P.. Java - guia do programador. 3a. ed. São Paulo: Novatec, 2015.
[8] RUMBAUGH, J.; BLAHA, M.; PREMERLANI, W.; EDDY, F.; LORENSEN, W.. Object-oriented modeling and design. Englewoods Cliffs: Prentice-Hall, 1991.
[9] STROUSTRUP, B.. The C++ Programming Language. 3rd Ed. Reading: Addison-Wesley, 1997.
[10] LANGSAM, Y.; AUGENSTEIN, M. J.; TENENBAUM, A. M.. Data structures using C and C++. 2nd Ed. Upper Saddle River: Prentice-Hall, 1996.