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