Saltar para o conteúdo

Delegation

Origem: Wikipédia, a enciclopédia livre.

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.

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.

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

Referências

  1. Gamma et al. 1994
  2. 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)
  3. «Delegation - Kotlin Programming Language». Kotlin. Consultado em 23 de março de 2019 

Ligações externas

[editar | editar código-fonte]