Skip to content

Commit a85e7f8

Browse files
committed
Tutorials - Translation PT-BR - Mixin Class Composition
1 parent 6747bd7 commit a85e7f8

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
layout: tutorial
3+
title: Composição de Classes Mixin
4+
5+
disqus: true
6+
7+
tutorial: scala-tour
8+
num: 5
9+
tutorial-next: anonymous-function-syntax
10+
tutorial-previous: traits
11+
language: pt-br
12+
---
13+
_Nota de tradução: A palavra `mixin` pode ser traduzida como mescla, porém é preferível utilizar a notação original_
14+
15+
Ao contrário de linguagens que suportam somente _herança simples_, Scala tem uma noção mais abrangente sobre a reutilização de classes. Scala torna possível reutilizar a _nova definição de membros de uma classe_ (por exemplo: o relacionamento delta para com a superclasse) na definição de uma nova classe. Isso é expressado como uma _composição de classe mixin ou mixin-class composition_. Considere a seguinte abstração para iterators.
16+
17+
```tut
18+
abstract class AbsIterator {
19+
type T
20+
def hasNext: Boolean
21+
def next: T
22+
}
23+
```
24+
25+
A seguir, considere a classe mixin que estende `AbsIterator` com um método `foreach` que aplica uma dada função para cada elemento retornado pelo iterator. Para definir tal classe que será utilizada como um mixin a palavra-chave `trait` deve ser declarada.
26+
27+
```tut
28+
trait RichIterator extends AbsIterator {
29+
def foreach(f: T => Unit) { while (hasNext) f(next) }
30+
}
31+
```
32+
33+
Aqui uma classes iterator concreta a qual retorna sucessivos caracteres de uma dada string:
34+
35+
```tut
36+
class StringIterator(s: String) extends AbsIterator {
37+
type T = Char
38+
private var i = 0
39+
def hasNext = i < s.length()
40+
def next = { val ch = s charAt i; i += 1; ch }
41+
}
42+
```
43+
44+
Poderíamos combinar a funcionalidade de `StringIterator` e `RichIterator` em uma só classe. Com herança simples e interfaces isso é impossível, pois ambas as classes contém implementações para seus membros. Scala nos ajuda com a sua _composição de classes mixin_. Isso permite que programadores reutilizem o delta de uma definição de uma classe, por exemplo: todas as novas definições não são herdadas. Esse mecanismo torna possível combinar `StringIterator` com `RichIterator`, como pode ser visto no programa teste a seguir, que imprime uma coluna de todos os caracteres de uma dada string.
45+
46+
```tut
47+
object StringIteratorTest {
48+
def main(args: Array[String]) {
49+
class Iter extends StringIterator(args(0)) with RichIterator
50+
val iter = new Iter
51+
iter foreach println
52+
}
53+
}
54+
```
55+
56+
A classe `Iter` na função `main` é construída a partir de uma composição dos pais `StringIterator` e `RichIterator` com a palavra-chave `with`. O primeiro pai é chamado de _superclass_ de `Iter`, já o segundo pai (e qualquer outro que venha após) é chamado de _mixin_ ou mescla.

0 commit comments

Comments
 (0)