Delegation
Na engenharia de software, o padrão de delegação é um padrão de design orientado a objetos que permite que a composição de objetos atinja a mesma reutilização de código que a herança, e serve como uma alternativa para obter o mesmo efeito da herança múltipla em linguagens que não a suportam.
Na delegação, um objeto (equivalente a classe filho na herança) lida com uma solicitação delegando a um segundo objeto (o delegate(delegado) )(equivalente a classe pai na herança), para isso o primeiro objeto torna-se proprietário do segundo objeto para usar suas propriedades e métodos. O delegado é um objeto auxiliar, mas com o domínio original . Com uma linguagem que tenha suporte para delegação, isso é feito implicitamente, fazendo com que o self
no delegado se refira ao objeto original (de envio), não ao delegado (objeto de recebimento). No padrão delegation, isso é feito ao passar explicitamente o objeto original para o delegado como uma de suas propriedades.[1] Observe que "delegação" costuma ser usada de maneira vaga para se referir ao conceito distinto de forwarding (encaminhamento), onde o objeto de envio simplesmente usa o membro correspondente no objeto de recebimento, avaliado no campo do objeto de recebimento, não o objeto original, no caso da delegação o objeto original está no campo do objeto delegado.
Observe que este artigo usa "objeto de envio / objeto de recebimento" para os dois objetos, em vez de "objeto de recebimento / delegado", enfatizando quais objetos enviam e recebem a chamada de delegação, não a chamada original.
Definition
[editar | editar código-fonte]Na introdução "Gamma et al. 1994, Grady Booch" definiu o delegation como:
Delegation é uma maneira de tornar a composição tão poderosa para reutilização quanto herança [Lie86, JZ91]. No delegation, dois objetos são envolvidos no tratamento de uma solicitação: o objeto receptor delega operações ao seu "delegado". Isso é análogo a subclasses transferindo requisições a classe pai. Mas com herança, uma operação herdada sempre pode se referir ao objeto receptor por meio do operador this C++ e self em Smalltalk. Para alcançar o mesmo efeito com a delegação, o receptor passa a si mesmo ao delegado para deixar que a operação delegada consulte o receptor.[2]
Ou seja ao invés de herdar as características da classe pai para a classe filho diretamente, a classe filho é adaptada para receber um objeto instanciado da classe pai para usar seus métodos, para que esses métodos fiquem disponíveis na classe filho é necessário redeclarar aquele método com o mesmo nome e dentro dele chamar o método do objeto pai.
Exemplo
[editar | editar código-fonte]
No exemplo abaixo (usando a linguagem de programação Kotlin ), a classe Window delega a chamada area()
ao seu objeto Rectangle interno (seu delegado).
class Rectangle(val width: Int, val height: Int) {
fun area() = width * height
}
class Window(val bounds: Rectangle) {
// Delegation
fun area() = bounds.area()
}
Outro exemplo em Java
// delegation
class RealPrinter {
// the "delegate"
void print()
{
System.out.println("The Delegate");
}
}
class Printer {
// the "delegator"
RealPrinter p = new RealPrinter();
// create the delegate
void print()
{
p.print(); // delegation
}
}
Suporte de linguagem
[editar | editar código-fonte]Algumas linguagens têm suporte especial para delegação incorporada.[3] Por exemplo, na linguagem de programação Kotlin, poderíamos escrever:
interface ClosedShape {
fun area(): Int
}
class Rectangle(val width: Int, val height: Int) : ClosedShape {
override fun area() = width * height
}
class Window(private val bounds: ClosedShape) : ClosedShape by bounds
Ver também
[editar | editar código-fonte]- Programação Orientada a Aspectos
- Delegação (computação)
- Padrão de design
- Padrão de fachada
Referências
- ↑ Gamma et al. 1994
- ↑ Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1995). Design patterns : elements of reusable object-oriented software 14. print. ed. Reading, Mass.: Addison-Wesley. p. 20. ISBN 0-201-63361-2 Verifique o valor de
|url-access=registration
(ajuda) - ↑ «Delegation - Kotlin Programming Language». Kotlin. Consultado em 23 de março de 2019
Ligações externas
[editar | editar código-fonte]- O que é delegação, WikiWikiWeb
- Delegação para o Código Rosetta