1
resposta

Polimorfismo em python

Alguém poderia fazer uma implementação em python que utiliza o recurso de polimorfismo. O padrão de projeto strategy usa o conceito de polimorfismo. O polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação (assinatura) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. A decisão sobre qual o método que deve ser selecionado, de acordo com o tipo da classe derivada, é tomada em tempo de execução. Desde já agradeço: o empenho, a compreensão e aguardo um retorno.

1 resposta

Franciscarlos,

Polimorfismo significa ter algo único em vários lugares. O polimorfismo é usado em classes distintas compartilhando funções em comum. Porque as classes derivadas são distintas, suas execuções podem diferir. Entretanto, as classes derivadas compartilham de uma relação comum, instâncias daquelas classes são usadas exatamente na mesma maneira.

class ObjetoGrafico(object):
    def __init__(self, centro):
        super(ObjetoGrafico, self).__init__()
        self._centro = centro

    @abstractmethod
    def desenha(self):
        pass

    def apaga(self):
        self.setPenColor(self.BACKGROUND_COLOR)
        self.desenha()
        self.setPenColor(self.FOREGROUND_COLOR)

    def movePara(self, p):
        self.apaga()
        self._centro = p
        self.desenho()

O método desenho é invocado a fim de extrair um objeto gráfico. O método apaga é invocado a fim de apagar um objeto gráfico. O método moverPara é usado para mover um objeto para uma posição especifica no desenho. O argumento do método moverPara é um ponto. O programa abaixo define a classe do ponto que representa uma posição em um desenho.

A classe ObjetoGrafico tem um único atributo _centro, que é um ponto que representa a posição em um desenho no ponto central do objeto gráfico.

O exemplo abaixo mostra uma execução possível para o método apaga: neste caso supomos que a imagem extraída está usando uma caneta imaginária.

Assumindo que nós sabemos extrair um objeto gráfico, nós podemos apagar o objeto mudando a cor da caneta de modo que combine a cor do fundo e então redesenhamos o objeto.

Uma vez que nós podemos apagar um objeto, mais fácil ainda será movê-lo.

Nós vimos que a classe ObjetoGrafico fornece execuções para os métodos apaga e movePara. Entretanto, a classe não fornece uma execução para o método desenha. Então o método é declarado para ser abstrato. Nós fazemos isto porque até que nós saibamos que tipo de objeto é, nós não podemos desenhá-lo!

Considere a classe Circulo abaixo. A classe Circulo estende a classe ObjetoGrafico. Conseqüentemente, herda o atributo centro e os métodos apaga e movePara. A classe Circulo adiciona um atributo _raio que sobrescreve o método desenha. O corpo do método desenha não é mostrado no exemplo, entretanto, nós vamos assumir um desenho de um circulo com um raio e o ponto centro dados.

class Circulo(ObjetoGrafico):
    def __init__(self, centro, raio):
        super(Circulo, self).__init__(centro)
        self._raio = raio

    def desenha(self):
        pass

Observe a maneira que o método init na classe Circulo é executado. Este método chama primeiramente o método init da superclasse Circulo, que é um ObjetoGrafico. O método init do ObjetoGrafico inicializa o atributo _centro. Então o método init do Circulo inicializa o atributo _raio.

Usando a classe Circulo definida acima podemos escrever algo assim agora:

c = Circulo(Ponto(0, 0), 5)
c.desenha()
c.movePara(Ponto(10, 10))
c.apaga()

Esta seqüência do código declara um objeto Circulo com seu centro inicialmente na posição (0,0) e no raio 5. O círculo é desenhado, movido e para (10,10), e depois apagado.

O exemplo abaixo define uma classe Retangulo. A classe Retangulo estende também a classe ObjetoGrafico. Conseqüentemente, herda o atributo centro e os métodos apaga e movePara. A classe Retangulo adiciona dois atributos adicionais, _altura e _largura, e sobrescreve o método desenha. O corpo do método desenha não é mostrado, entretanto, nós vamos supor que desenha um retângulo com as dimensões dadas.

class Retangulo(ObjetoGrafico):
    def __init__(self, centro, altura, largura):
        super(Retangulo, self).__init__(centro)
        self._altura = altura
        self._largura = largura

    def desenha(self):
        pass

A classe Quadrado estende a classe Retangulo abaixo. Nenhum atributo ou método novo são inicializados -- aqueles herdados de ObjetoGrafico ou de Retangulo são suficientes. O método do init simplesmente certificar que a altura e largura de um quadrado são iguais!

class Quadrado(Retangulo):
    def __init__(self, centro, largura):
        super(Quadrado, self).__init__(centro, largura, largura)

Para saber mais, sugiro que vc leia os livros:

1) Introdução à Orientação a Objetos com C++ e Python - Editora Novatec - https://novatec.com.br/livros/introducao-orientacao-objetos/

2) Orientação a Objetos: Aprenda seus conceitos e suas aplicabilidades de forma efetiva - https://www.casadocodigo.com.br/products/livro-oo-conceitos