-
Notifications
You must be signed in to change notification settings - Fork 14
/
097_use_os_modificadores_de_acesso_para_controlar_encapsulamento_de_metodos.rb
executable file
·106 lines (77 loc) · 1.88 KB
/
097_use_os_modificadores_de_acesso_para_controlar_encapsulamento_de_metodos.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# 10/06/2016 - Everaldo Gomes - [email protected]
#
# 097 - Use os modificadores de acesso para controlar encapsulamento de métodos
#
#
# São 3 os modificadores de acesso:
#
# public
# private
# protected
#
#
# Além das variáveis de instância, que são automaticamente protegidas e expostas
# somente com os accessors, é possível proteger outros métodos.
#
# Public torna todos os métodos abaixo do modificador visíveis.
#
# Private torna os métodos privados, acessíveis somente na própria classe.
#
# Protected é parecido com private, mas pode ser acessado pelas classes herdeiras.
#
#
#
# http://ruby-doc.org/core-2.3.1/Module.html#method-i-public
# http://ruby-doc.org/core-2.3.1/Module.html#method-i-private
# http://ruby-doc.org/core-2.3.1/Module.html#method-i-protected
#
#
class MochileiroDasGalaxias
def sentido_da_vida
calculo_do_sentido_da_vida
end
private
def calculo_do_sentido_da_vida
42
end
end
mochileiro = MochileiroDasGalaxias.new
begin
mochileiro.calculo_do_sentido_da_vida
rescue NoMethodError => ex
puts "Não pode chamar métodos privados"
puts "Mensagem=#{ex}"
end
#
# Na verdade, você pode trapacear com meta-programação :D
#
puts mochileiro.send(:calculo_do_sentido_da_vida)
#
# Para honrar o controle de acesso, use public_send
#
begin
mochileiro.public_send(:calculo_do_sentido_da_vida)
rescue NoMethodError => ex
puts "Public send honra o modificador de acesso"
puts "Mensagem=#{ex}"
end
class Geladeira
# se você não colocar nada, assume-se que os métodos são públicos
def to_s
"Geladeira pesa=#{peso}"
end
protected
def peso
100
end
end
class GeladeiraTurbo < Geladeira
def peso # você pode invocar o método da classe pai com super
0.8 * super
end
end
puts Geladeira.new # imprime 100
puts GeladeiraTurbo.new # imprime 80.0
#
# Compre a nova geladeira turbo, pesa 20% a menos :)
#