-
Notifications
You must be signed in to change notification settings - Fork 11
/
sobreposicao-de-metodos.html
169 lines (156 loc) · 10.6 KB
/
sobreposicao-de-metodos.html
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Sobreposição (Overriding) de Métodos</title>
<meta name="author" content="" />
<!--- Blueprint CSS Framework -->
<link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
<link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print">
<!--[if IE]>
<link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
<![endif]-->
<!-- CodeRay syntax highlighting CSS -->
<link rel="stylesheet" href="css/coderay.css" type="text/css" />
<!-- Homepage CSS -->
<link rel="stylesheet" href="css/site.css" type="text/css" media="screen, projection" />
</head>
<body>
<div class="container">
<div class="column span-22 prepend-1 append-1 first last" id="header">
<h1 class="title"><a href="index.html" alt="voltar para o início">Tutorial de Ruby do GURU-SP</a></h1>
<hr>
</div>
<div class="column span-17 prepend-1 first">
<p class="title">Sobreposição (Overriding) de Métodos</p>
<p><b>Sobreposição de métodos</b> (override) em programação orientada a objetos, é um recurso da linguagem que permite que a subclasse, rescreva uma implementação especifica de um método que já esta previsto em uma superclasse. A implementação na subclasse sobrepõe a implementação na superclasse.</p>
<p>Aqui esta um exemplo <b>p037xmtdoverride.rb</b>:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="r">class</span> <span class="cl">A</span>
<span class="no"> 2</span> <span class="r">def</span> <span class="fu">a</span>
<span class="no"> 3</span> puts <span class="s"><span class="dl">'</span><span class="k">Na classe A</span><span class="dl">'</span></span>
<span class="no"> 4</span> <span class="r">end</span>
<span class="no"> 5</span> <span class="r">end</span>
<span class="no"> 6</span>
<span class="no"> 7</span> <span class="r">class</span> <span class="cl">B</span> < <span class="co">A</span>
<span class="no"> 8</span> <span class="r">def</span> <span class="fu">a</span>
<span class="no"> 9</span> puts <span class="s"><span class="dl">'</span><span class="k">Na classe B</span><span class="dl">'</span></span>
<span class="no"><strong>10</strong></span> <span class="r">end</span>
<span class="no">11</span> <span class="r">end</span>
<span class="no">12</span>
<span class="no">13</span> b = <span class="co">B</span>.new
<span class="no">14</span> b.a
</pre>
</div>
<p>O Método na classe B sobrepôs o método na classe A.</p>
<h2>Uso do super</h2>
<p>A forma de se lidar com argumentos <b>super</b>:</p>
<ul>
<li>Quando você invoca <b>super</b> sem argumentos, Ruby envia uma mensagem para o pai do objeto atual, pedindo para invocar um método do mesmo nome que o método que invocou <b>super</b>, ele automaticamente encaminha os argumentos que foram passados para o método a partir de qual foi chamado.</li>
<li>Chamando com uma lista de argumentos vazia – <b>super()</b>- ele não envia argumentos para o primeiro método, até mesmo se os argumentos foram passados para o método atual.</li>
<li>Chamando com argumentos específicos – <b>super(a, b, c)</b> – envia exatamente esses argumentos.</li>
</ul>
<p>Um exemplo (<b>p038bicycle.rb</b>) do livro <em>Ruby for Rails</em> enfatiza isso:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="r">class</span> <span class="cl">Bicicleta</span>
<span class="no"> 2</span> attr_reader <span class="sy">:marchas</span>, <span class="sy">:rodas</span>, <span class="sy">:bancos</span>
<span class="no"> 3</span> <span class="r">def</span> <span class="fu">initialize</span>(gears = <span class="i">1</span>)
<span class="no"> 4</span> <span class="iv">@rodas</span> = <span class="i">2</span>
<span class="no"> 5</span> <span class="iv">@bancos</span> = <span class="i">1</span>
<span class="no"> 6</span> <span class="iv">@marchas</span> = gears
<span class="no"> 7</span> <span class="r">end</span>
<span class="no"> 8</span> <span class="r">end</span>
<span class="no"> 9</span>
<span class="no"><strong>10</strong></span> <span class="r">class</span> <span class="cl">Tandem</span> < <span class="co">Bicicleta</span>
<span class="no">11</span> <span class="r">def</span> <span class="fu">initialize</span>(gears)
<span class="no">12</span> <span class="r">super</span>
<span class="no">13</span> <span class="iv">@bancos</span> = <span class="i">2</span>
<span class="no">14</span> <span class="r">end</span>
<span class="no">15</span> <span class="r">end</span>
<span class="no">16</span>
<span class="no">17</span> t = <span class="co">Tandem</span>.new(<span class="i">2</span>)
<span class="no">18</span> puts t.marchas
<span class="no">19</span> puts t.rodas
<span class="no"><strong>20</strong></span> puts t.bancos
<span class="no">21</span> b = <span class="co">Bicicleta</span>.new
<span class="no">22</span> puts b.marchas
<span class="no">23</span> puts b.rodas
<span class="no">24</span> puts b.bancos
</pre>
</div>
<p>A saída:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p038bicycle.rb
<span class="no">2</span> 2
<span class="no">3</span> 2
<span class="no">4</span> 2
<span class="no">5</span> 1
<span class="no">6</span> 2
<span class="no">7</span> 1
<span class="no">8</span> >Exit code: 0
</pre>
</div>
<p>Vamos falar com mais detalhes sobre <b>attr_reader</b> <a href="controle-de-acesso.html">mais tarde</a>.</p>
<h2>Redefinindo Métodos</h2>
<p>(Adaptado do livro de David Black, Ruby for Rails)</p>
<p>Nada impede que você defina um método duas vezes. Programa <b>p038or.rb</b>:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="r">class</span> <span class="cl">OR</span>
<span class="no"> 2</span> <span class="r">def</span> <span class="fu">mtd</span>
<span class="no"> 3</span> puts <span class="s"><span class="dl">"</span><span class="k">Primeira definição do método mtd</span><span class="dl">"</span></span>
<span class="no"> 4</span> <span class="r">end</span>
<span class="no"> 5</span> <span class="r">def</span> <span class="fu">mtd</span>
<span class="no"> 6</span> puts <span class="s"><span class="dl">"</span><span class="k">Primeira definição do método mtd</span><span class="dl">"</span></span>
<span class="no"> 7</span> <span class="r">end</span>
<span class="no"> 8</span> <span class="r">end</span>
<span class="no"> 9</span> <span class="co">OR</span>.new.mtd
</pre>
</div>
<p>O que acontece quando chamamos o mtd em uma instancia de OR? Vamos descobrir:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="co">OR</span>.new.mtd
</pre>
</div>
<p>O resultado mostrado é a segunda definição do método mtd. A segunda definição é prevalecida: Nós vemos o resultado pela segunda, não pela primeira. Nada impede que você defina um método duas vezes, no entanto, a nova versão tem precedência.</p>
<h2>Classe Abstrata</h2>
<p>Em Ruby, podemos definir uma classe abstrata como a que invoca certos métodos “abstratos” indefinidos, que é deixado para as subclasses definir. Por exemplo:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># Essa classe é abstrata, mais não define Ola ou Nome </span>
<span class="no"> 2</span> <span class="c"># Nenhuma sintaxe especial é necessária: qualquer classe que invoca métodos</span>
<span class="no"> 3</span> <span class="c"># que são destinados para uma subclasse é abstrata</span>
<span class="no"> 4</span>
<span class="no"> 5</span> <span class="r">class</span> <span class="cl">AbstractKlass</span>
<span class="no"> 6</span> <span class="r">def</span> <span class="fu">bemvindo</span>
<span class="no"> 7</span> puts <span class="s"><span class="dl">"</span><span class="il"><span class="idl">#{</span>ola<span class="idl">}</span></span><span class="k"> </span><span class="il"><span class="idl">#{</span>nome<span class="idl">}</span></span><span class="dl">"</span></span>
<span class="no"> 8</span> <span class="r">end</span>
<span class="no"> 9</span> <span class="r">end</span>
<span class="no"><strong>10</strong></span>
<span class="no">11</span> <span class="c"># uma classe concreta</span>
<span class="no">12</span> <span class="r">class</span> <span class="cl">ConcreteKlass</span> < <span class="co">AbstractKlass</span>
<span class="no">13</span> <span class="r">def</span> <span class="fu">ola</span>; <span class="s"><span class="dl">"</span><span class="k">Ola</span><span class="dl">"</span></span>; <span class="r">end</span>
<span class="no">14</span> <span class="r">def</span> <span class="fu">nome</span>; <span class="s"><span class="dl">"</span><span class="k">Estudantes de Ruby</span><span class="dl">"</span></span>; <span class="r">end</span>
<span class="no">15</span> <span class="r">end</span>
<span class="no">16</span>
<span class="no">17</span> <span class="co">ConcreteKlass</span>.new.bemvindo <span class="c"># imprime "Ola Estudantes de Ruby"</span>
</pre>
</div>
<div class="pagination"><a href="sobrecarregando-metodos.html">Sobrecarregando métodos em Ruby ></a></div>
</div>
<div class="column span-5 append-1 last">
<p><a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP"><img src="images/logo_guru-sp.jpg" title="Logo do GURU-SP" alt="Logo do Guru-SP" /></a></p>
<div class="box">
<p>Este material tem como base o <a href="http://www.rubylearning.com" title="Ruby Learning">tutorial do RubyLearning.com de Satish Talim</a> e foi traduzido por membros do <a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP">GURU-SP</a> com a permissão do autor.</p>
<p class="last">Ajude o RubyLearning participando em algum dos <a href="http://www.rubylearning.org" title="cursos do Ruby Learning">cursos pagos</a> ou <a href="http://pledgie.com/campaigns/415" title="Ajude o Ruby Learning">fazendo uma doação para o projeto</a></p>
</div>
<p class="quiet"><a href="index.html" title="índice">Voltar para o índice</a></p>
<h5></h5>
<p class="incr"></p>
</div>
<div class="column span-22 prepend-1 append-1 first last" id="footer">
<hr />
<p>Tuturial de Ruby do <a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP">GURU-SP</a>. Este site foi criado com <a href="http://webby.rubyforge.org">Webby</a></p>
</div>
</div>
</body>
</html>