Curso de Ruby - Programação Orientada a Objetos em Ruby
Nesse post vamos aprender sobre Classes e Objetos em Ruby, que são os pilares da Programação Orientada a Objetos (POO). Ruby é uma linguagem completamente orientada a objetos, o que significa que tudo em Ruby é um objeto, incluindo números e até mesmo classes.
O que é uma Classe?
Uma classe é como um modelo ou plano de construção para criar objetos. Uma classe define as propriedades e comportamentos (métodos) que os objetos dessa classe terão. Ela pode ser vista como um molde, enquanto os objetos são as instâncias dessa classe.
Sintaxe Básica para Definir uma Classe
class NomeDaClasse
# Definindo atributos (variáveis de instância)
def initialize(parametros)
@atributo1 = parametros
end
# Métodos (comportamentos) da classe
def nome_do_metodo
# código
end
end
initialize
é um método especial chamado construtor. Ele é chamado automaticamente sempre que uma nova instância da classe é criada. Os parâmetros passados parainitialize
são usados para inicializar os atributos do objeto.
Definindo uma Classe e Criando um Objeto
Vamos ver um exemplo básico de como criar uma classe e instanciar um objeto dessa classe.
Exemplo 1: Definindo uma Classe Simples
class Pessoa
def initialize(nome, idade)
@nome = nome
@idade = idade
end
def saudacao
"Olá, meu nome é #{@nome} e eu tenho #{@idade} anos."
end
end
# Criando um objeto (instância) da classe Pessoa
pessoa1 = Pessoa.new("João", 30)
puts pessoa1.saudacao # Saída: Olá, meu nome é João e eu tenho 30 anos.
Detalhes:
initialize
define como o objeto será inicializado.@nome
e@idade
são variáveis de instância. Elas são exclusivas de cada instância (objeto) da classe.Pessoa.new("João", 30)
cria um novo objeto da classePessoa
.
Atributos e Métodos
Dentro de uma classe, você pode ter atributos e métodos.
- Atributos são variáveis que armazenam dados dentro de um objeto.
- Métodos são funções que definem o comportamento de um objeto.
Atributos de Leitura e Escrita
Para tornar um atributo acessível (ler ou modificar seu valor) de fora da classe, você pode usar os métodos getter e setter.
- Getter: Método para acessar um atributo.
- Setter: Método para modificar um atributo.
Exemplo 2: Atributos Getter e Setter
class Carro
def initialize(modelo, cor)
@modelo = modelo
@cor = cor
end
# Getter e Setter para o modelo
def modelo
@modelo
end
def modelo=(novo_modelo)
@modelo = novo_modelo
end
# Getter e Setter para a cor
def cor
@cor
end
def cor=(nova_cor)
@cor = nova_cor
end
end
# Criando um objeto da classe Carro
carro1 = Carro.new("Fusca", "azul")
puts carro1.modelo # Saída: Fusca
puts carro1.cor # Saída: azul
# Alterando os atributos
carro1.modelo = "Civic"
carro1.cor = "preto"
puts carro1.modelo # Saída: Civic
puts carro1.cor # Saída: preto
Métodos de Classe
Além dos métodos de instância (que pertencem a objetos), podemos criar métodos de classe, que pertencem à própria classe e não a instâncias específicas.
Exemplo 3: Método de Classe
class Matematica
def self.somar(a, b)
a + b
end
end
# Chamando o método de classe
puts Matematica.somar(5, 3) # Saída: 8
self.somar
define um método de classe. Oself
se refere à própria classeMatematica
e não a um objeto específico.
Herança
A herança é um conceito central da POO onde uma classe pode herdar comportamentos e atributos de outra classe. Isso permite criar novas classes baseadas em classes existentes, sem duplicar código.
Exemplo 4: Herança
class Animal
def initialize(nome)
@nome = nome
end
def falar
"Eu sou um animal."
end
end
class Cachorro < Animal
def falar
"Au Au!"
end
end
# Criando objetos
animal = Animal.new("Genérico")
cachorro = Cachorro.new("Rex")
puts animal.falar # Saída: Eu sou um animal.
puts cachorro.falar # Saída: Au Au!
Detalhes:
Cachorro < Animal
indica que a classeCachorro
herda deAnimal
.- A classe
Cachorro
pode sobrescrever o métodofalar
para oferecer um comportamento diferente.
Polimorfismo
O polimorfismo permite que diferentes classes compartilhem o mesmo nome de método, mas com comportamentos diferentes. Isso é possível através da herança e sobrescrita de métodos.
No exemplo anterior, o método falar
foi polimórfico, pois o comportamento do método foi diferente para o Animal
e para o Cachorro
.
Encapsulamento
O encapsulamento é o conceito de ocultar os detalhes internos de uma classe e expor apenas o que é necessário para o uso externo. Em Ruby, isso é feito principalmente usando métodos de leitura e escrita para acessar variáveis de instância.
Exemplo 5: Encapsulamento
class ContaBancaria
def initialize(saldo)
@saldo = saldo
end
def saldo
@saldo
end
def depositar(valor)
@saldo += valor
end
end
conta = ContaBancaria.new(100)
conta.depositar(50)
puts conta.saldo # Saída: 150
@saldo
é uma variável de instância privada.- O acesso a ela é feito através dos métodos
saldo
edepositar
, garantindo que o saldo não seja modificado diretamente fora da classe.
Exercício
Agora, pratique criando suas próprias classes e objetos! 💪
1️⃣ Crie uma classe Pessoa com os atributos nome
e idade
. Implemente um método falar
que retorna uma saudação usando o nome e a idade da pessoa.
2️⃣ Crie uma classe Produto com os atributos nome
, preço
e quantidade_em_estoque
. Implemente métodos para adicionar e remover unidades do produto no estoque, além de um método para calcular o valor total do estoque (preço * quantidade).
Se quiser, tente resolver e envie nos comentários seus códigos e suas respostas para analisarmos juntos! 🚀
Próxima aula - Desafio Final - Jogo das Luzes