Material da aula 16.A! Veja mais informações sobre o curso e a lista completa das aulas em: http://cursoprogramacao.rafaelbiriba.com/
16.A. Classes e Objetos 2
Nessa aula eu explico herança de classes, override (sobrescrita de métodos), método super, e a diferença entre require e require_relative. É uma aula continuação da aula 15A
Não deixe de tentar resolver os exercícios da aula e investir algum tempo estudando mais sobre o assunto.
Vídeo da aula
Conteúdo da aula
-
herança
-
Override e super
-
require
Herança
class Carro
def rodas
4
end
end
class Corsa < Carro
end
meu_carro = Corsa.new
meu_carro.rodas # 4
class Carro
def rodas
4
end
end
class Corsa < Carro
attr_reader :nome
def initialize(nome)
@nome = nome
end
end
meu_carro = Corsa.new("corsinha")
meu_carro.rodas # 4
meu_carro.nome # "corsinha"
Override
class Animal
def self.som
"Grrrr"
end
end
class Cachorro < Animal
end
Animal.som # Grrrr
Cachorro.som # Grrrr
##################################
class Animal
def self.som
"Grrrr"
end
end
class Cachorro < Animal
def self.som
"Au au"
end
end
Animal.som # Grrrr
Cachorro.som # Au Au
class Pizza
attr_reader :sabor, :preco
def initialize(sabor, preco)
@sabor = sabor
@preco = preco
end
end
class Mussarela < Pizza
end
pizza1 = Mussarela.new #ArgumentError (wrong number of arguments (given 0, expected 2))
#########################
class Pizza
attr_reader :sabor, :preco
def initialize(sabor, preco)
@sabor = sabor
@preco = preco
end
end
class Mussarela < Pizza
# Override
def initialize
end
end
pizza1 = Mussarela.new
pizza1.sabor # nil
pizza1.preco # nil
# Sabor e preco vazios, pois o método de initialize foi sobrescrito e com isso não está inicializando as variáveis
#########################
class Pizza
attr_reader :sabor, :preco
def initialize(sabor, preco)
@sabor = sabor
@preco = preco
end
end
class Mussarela < Pizza
# Override
def initialize(preco)
@sabor = "mussarela"
@preco = preco
end
end
pizza1 = Mussarela.new(35)
pizza1.sabor # mussarela
pizza1.preco # 35
Super
class Pizza
attr_reader :sabor, :preco
def initialize(sabor, preco)
@sabor = sabor
@preco = preco
end
end
class Mussarela < Pizza
def initialize(preco)
super("mussarela", preco)
end
end
pizza1 = Mussarela.new(35)
pizza1.sabor # mussarela
pizza1.preco # 35
class PizzaBasica
def self.preco
35
end
end
class PizzaCalabreza < PizzaBasica
def self.preco
# super chama o método preco da classe acima "PizzaBasica" e retorna o valor
super + 5
end
end
PizzaBasica.preco # 35
PizzaCalabreza.preco # 40
require e require_relative
É uma best practice
do ruby de criar uma classe em arquivos ruby separados. Isso contribui para que o código fique organizado.
Utilizando require
é possível espalhar o código em arquivos diferentes ruby, e no topo de cada arquivo, podemos dar require daquele arquivo que precisamos.
-
require
: Usado para bibliotecas (gems
) ou para requerer arquivos. Necessário passar o caminho completo, por exemplo:require 'C:/Projetos/Ruby/minha_pasta/meu_arquivo.rb'
-
require_relative
: Uma forma alternativa para requerer um arquivo local, não precisando passar o caminho completo. Se o arquivo estiver na mesma pasta, basta fazerrequire_relative 'meu_arquivo.rb'
# carro.rb
class Carro
def self.rodas
4
end
end
# fusca.rb
require_relative "carro.rb"
class Fusca < Carro
end
puts Fusca.rodas
Links úteis
Exercícios
1.
Considerando o código abaixo:
class Bicicleta
def rodas
2
end
def motorizada
false
end
end
Escreva uma classe BicicletaEletrica
que extende Bicicleta
, sobrescrevendo o método motorizada
para retornar true
, de forma que o código abaixo funcine com a nova classe BicicletaEletrica.
minha_bike_normal = Bicicleta.new
minha_bike_normal.rodas # 2
minha_bike_normal.motorizada # false
minha_bike = BicicletaEletrica.new
minha_bike.rodas # 2
minha_bike.motorizada # true
2.
Considerando o código abaixo:
class Carro
def lugares
2
end
def combustivel
"gasolina"
end
end
Implemente uma classe CorsaFlex
que extende de carro. O CorsaFlex
possui 4 lugares (ao invés de 2). E funciona com gasolina
e alcool
.
NOTA: Utilizar super
nesse exercício.
carro = CorsaFlex.new
carro.lugares # 4
carro.combustivel # gasolina e alcool
3.
Considerando o arquivo circulo.rb
com o código abaixo:
# arquivo circulo.rb
class Circulo
def self.area_circulo(raio)
3.1416*raio*raio
end
end
Crie um arquivo pizza.rb
e escreva uma classe Pizza
(ela não extende nenhuma classe). Você deve receber o tamanho da pizza (diâmetro) na inicialização, e criar um método area
para retornar a área da pizza em cm2
NOTA: Circulo.area_circulo
recebe raio
que é metade do diâmetro
DICA: Não deixe de requerer o arquivo circulo.rb
para poder utilizar o método area_circulo
.
pizza = Pizza.new(20)
pizza.area # 314.16 cm2