Conceitos de POO para iniciantes: polimorfismo explicado

Publicados: 2021-12-10

Em linguagens de alto nível, como Python e Java, OOP ou programação orientada a objetos refere-se à organização do design de software em torno de dados e objetos, em vez de lógica e funções. Um objeto é definido como um campo de dados com atributos e comportamento únicos. Em outras palavras, a POO se concentra em objetos em vez de lógica. Esse modelo de programação é ideal para programas grandes e complexos que exigem atualizações e manutenção ativas. Além disso, traz para a mesa os benefícios adicionais de escalabilidade, eficiência e reutilização de código.

A OOP tem quatro blocos de construção fundamentais – polimorfismo, encapsulamento, abstração e herança. Como o escopo do nosso artigo é limitado ao polimorfismo em OOPs, discutiremos o polimorfismo em detalhes, incluindo exemplos de polimorfismo em Java e polimorfismo em Python.

Aprenda cursos de software online das melhores universidades do mundo. Ganhe Programas PG Executivos, Programas de Certificado Avançado ou Programas de Mestrado para acelerar sua carreira.

Índice

Definição de polimorfismo

A definição de polimorfismo mais simples seria que polimorfismo significa existir em várias formas. Tem suas raízes em dois termos gregos – 'poli', que significa 'numerosos' e 'morfo', que se traduz em 'formas'.

Para entender melhor o conceito, vamos dar um exemplo simples primeiro. Veja o exemplo do comportamento do cursor, o mesmo cursor que você vê se movendo na tela toda vez que usa um mouse ou trackpad. Dependendo das ações do usuário ou do modo do programa, o cursor pode assumir diferentes formas, como uma seta, uma cruz, uma linha ou um dedo indicador.

O polimorfismo é uma das características mais significativas da POO. Em Java e Python, variáveis, objetos e funções podem existir de várias formas. No polimorfismo, uma subclasse ou método define seus atributos e comportamentos enquanto retém algumas das funcionalidades de sua classe pai. Isso nos leva à herança, que permite criar hierarquias de classes onde uma classe base fornece seus atributos e comportamento a uma classe derivada. Subsequentemente, as funcionalidades da classe derivada podem ser livremente modificadas ou estendidas conforme necessário. Para isso, o polimorfismo garante que o método correto seja executado com base no tipo do objeto chamador.

Para colocar em perspectiva, suponha que você tenha uma classe que exiba a data e a hora. Agora, você cria um método que herda a classe e exibe a mensagem “Hello!” juntamente com a data e hora.

Exemplo de polimorfismo em Java

Considere a superclasse “Shapes” que possui um método “area()”. As subclasses em "Forma" podem ser "Retângulo", "Círculo", "Triângulo", etc., e cada subclasse tem seu método para calcular a área. Aplicando os conceitos de herança e polimorfismo, as subclasses utilizam o método “area()” para encontrar a fórmula de cálculo da área da respectiva forma.

classe Formas {

public void area() {

System.out.println(“A fórmula para a área de”);

}

}

class Triângulo estende Formas {

public void area() {

System.out.println("Triângulo é 1/2 * base * altura ");

}

}

class Circle estende Formas {

public void area() {

System.out.println("Círculo é 3,14 * raio * raio ");

}

}

classe Principal {

public static void main(String[] args) {

Formas minhaForma = new Formas(); // Cria um objeto Shapes

Formas meuTriângulo = new Triângulo(); // Cria um objeto Triângulo

Formas meuCírculo = new Círculo(); // Cria um objeto Círculo

minhaForma.area();

meuTriângulo.area();

minhaForma.area();

meuCírculo.area();

}

}

A saída do código do programa acima será a seguinte:

A fórmula da área do triângulo é 1/2 * base * altura

A fórmula para a área do círculo é 3,14 * raio * raio

Tipos de polimorfismo em OOPs

O polimorfismo em OOPs é de dois tipos – estático (polimorfismo em tempo de compilação) e dinâmico (polimorfismo em tempo de execução).

1. Polimorfismo estático

Em Java, a sobrecarga de métodos é o tipo mais comum de polimorfismo estático. Ele pode criar vários métodos com o mesmo nome dentro da mesma classe, mas com parâmetros diferentes. Os conjuntos de parâmetros devem diferir em pelo menos um dos três critérios a seguir:

  • Os métodos precisam ter diferentes números de parâmetros.
  • Os tipos de parâmetros precisam ser diferentes. Por exemplo, se um método aceita um Long, o outro aceita um String.
  • Os métodos devem aceitar os parâmetros em ordens diferentes. Por exemplo, se o método 1 aceitar um Long e um String, o método dois deverá aceitar um String e depois um Long.

Na sobrecarga de métodos, ao chamar o método, o compilador escolhe qual método chamar com base nos parâmetros passados ​​durante a chamada. Isso ocorre em tempo de compilação e, portanto, esse tipo de polimorfismo também é conhecido como polimorfismo em tempo de compilação.

A seguir está um exemplo de código Java para mostrar o polimorfismo em tempo de compilação. Neste exemplo, o método add() está sobrecarregado com dois tipos diferentes de parâmetros.

pacote estáticoPolimorfismo;

Adição de classe pública

{

soma nula(int x, int y)

{

intc = x+y;

System.out.println(“ Adição de dois números :” +c); }

soma nula(int x, int y, int z)

{

intc = x+y+z;

System.out.println(“ Adição de três números :” +c); }

public static void main(String[] args)

{

Adição obj = new Adição();

obj.soma (45,34);

obj.sum(60, 32, 11);

}

}

A saída do programa acima será:

Adição de dois números: 79

Adição de três números: 103

2. Polimorfismo dinâmico

O polimorfismo dinâmico ou de tempo de execução é obtido por meio da substituição de método. Aqui, os métodos estão em diferentes formas em diferentes classes (substituição de método) e, em vez de tempo de compilação, a chamada para um método substituído é resolvida em tempo de execução. Agora, ao atribuir um objeto a uma referência de classe e chamar um método, o método na classe do objeto é executado. Como o objeto é criado em tempo de execução, a forma do método (no objeto) que deve ser executado só é decidida em tempo de execução.

A seguir está um exemplo de código Java para mostrar o polimorfismo de tempo de execução . No exemplo, há uma superclasse "Animal" e três subclasses, "canguru", "tigre" e "peixe". As subclasses estendem a superclasse e substituem seu método “move()”. O método “move()” é chamado pela variável de referência da classe pai “Animal”.

classe Animal{

void mover(){

System.out.println(“Animais se movem”);

}

}

classe canguru estende Animal{

void mover(){

System.out.println(“Cangurus saltam”);

}

}

classe tigre estende Animal{

void mover(){

System.out.println(“Tigres andam”);

}

}

classe peixe estende Animal{

void mover(){

System.out.println(“Peixe nadando”);

}

}

classe principal{

public static void main(String args[]){

Animal A = new Animal();

Animal k = new canguru(); //transmitindo

Animal t = novo tigre(); //transmitindo

Animal f = novo peixe(); //transmitindo

A.mover();

k.mover();

t.mover();

f.mover();

}

}

A saída do programa acima será:

Animais se movem

Os cangurus saltam

Tigres andam

Peixes nadam

Polimorfismo em Python

O polimorfismo em Python é de três tipos – polimorfismo de operador, polimorfismo de função e polimorfismo de classe. O Python também permite a substituição de métodos, mas não a sobrecarga de métodos.

1. Polimorfismo de operador

Em Python, o operador '+' tem uso duplo. Ele é usado para operações de adição aritmética no caso de tipos de dados inteiros e, para strings, o operador '+' realiza concatenações.

A seguir está um exemplo de código Python onde o operador '+' realiza adição em tipos de dados inteiros:

num1 = 4

num2 = 5

print(num1+num2)

A saída do código do programa acima é '9'.

A seguir está um exemplo de código Python onde o operador '+' realiza a concatenação em tipos de dados de string:

str1 = “Bom”

str2 = “Noite”

print(str1+” “+str2)

A saída do programa acima será 'Boa Noite'.

2. Polimorfismo de função

A função 'len()' em Python é compatível com diferentes tipos de dados, como lista, string, tupla, dicionário e conjunto, mas retorna informações específicas para cada tipo de dados. Aqui está um exemplo:

print(len(“Programador”))

print(len([“Python”, “Java”, “C”])))

print(len({“Nome”: “Kathy”, “Endereço”: “Texas”}))

O programa acima terá a seguinte saída:

9

3

2

3. Polimorfismo de classe

Estendendo o conceito de polimorfismo, o Python permite que várias classes tenham métodos com o mesmo nome. Dado abaixo é um exemplo para mostrar polimorfismo em métodos de classe em Python. No exemplo, existem duas classes, 'Gato' e 'Cão'. Eles têm uma estrutura semelhante e têm os mesmos nomes de métodos 'make_sound()' e 'info()'.

classe Gato:

def __init__(self, name, age):

self.name = nome

self.idade = idade

def info(auto):

print(f"Sou um gato. Meu nome é {self.name}. Tenho {self.age} anos.")

def make_sound(self):

print("Miau")

classe Cão:

def __init__(self, name, age):

self.name = nome

self.idade = idade

def info(auto):

print(f"Sou um cachorro. Meu nome é {self.name}. Tenho {self.age} anos.")

def make_sound(self):

print("Latido")

gato1 = Gato(“Minnie”, 3)

cão1 = cão(“Tom”, 6)

para animal em (gato1, cachorro1):

animal.make_sound()

animal.info()

animal.make_sound()

A saída será a seguinte:

Miau

Eu sou um gato. Meu nome é Minnie. Eu tenho 3 anos.

Miau

Latido

Eu sou um cão. Meu nome é Tom. Eu tenho 6 anos de idade.

Latido

4. Substituição de Método

Python também permite que classes filhas herdem atributos e métodos da classe pai. Certos métodos e atributos podem ser redefinidos para se ajustarem à classe filha (substituição de método). O polimorfismo permite o acesso aos métodos e atributos substituídos com o mesmo nome da classe pai.

A seguir está um exemplo de código Python para ilustrar a substituição do método:

da importação de matemática pi

forma de classe:

def __init__(self, name):

self.name = nome

def area(auto):

passar

def fato (auto):

return “Eu sou uma figura fechada.”

def __str__(self):

return self.name

classe Quadrado(Forma):

def __init__(self, comprimento):

super().__init__(“Quadrado”)

self.length = comprimento

def area(auto):

return self.length**2

def fato (auto):

return “Cada ângulo em um quadrado é igual a 90 graus.”

class Círculo(Forma):

def __init__(self, raio):

super().__init__(“Círculo”)

self.radius = raio

def area(auto):

return pi*self.radius**2

a = Quadrado(4)

b = Círculo(7)

imprimir(b)

print(b.fact())

print(a.fact())

print(b.area())

O programa acima terá a seguinte saída:

Círculo

Eu sou uma figura fechada.

Cada ângulo em um quadrado é igual a 90 graus.

153.93804002589985

Saiba mais sobre a substituição de método.

Vantagens do polimorfismo em OOPs

O polimorfismo em OOPs tem três vantagens significativas. Eles são os seguintes:

  • O polimorfismo permite a reutilização do código. Assim, uma vez que as classes são escritas, testadas e implementadas, você pode reutilizá-las repetidamente. Além disso, o código pode ser alterado sem afetar o código original. Tudo isso economiza um tempo significativo para o codificador.
  • No polimorfismo, vários valores de dados podem ser armazenados em uma única variável. Além disso, o valor de uma variável herdado de uma superclasse em uma subclasse pode ser modificado sem alterar o valor da variável na superclasse ou em qualquer subclasse.
  • Por fim, o polimorfismo funciona com menos linhas de código, o que, por sua vez, facilita a depuração para o programador.

Caminho a seguir

upGrad, em parceria com a prestigiosa Liverpool John Moores University, oferece um rigoroso programa online de Mestrado em Ciência de Dados para profissionais que desejam fazer uma carreira em ciência de dados. O curso termina com um mestrado da LJMU e uma certificação Executive PG Program do IIIT Bangalore.

Destaques do programa:

  • Mais de 500 horas de conteúdo, mais de 60 estudos de caso e projetos, mais de 20 sessões ao vivo
  • Cobertura abrangente de mais de 14 ferramentas e softwares, como Python, AWS, MySQL e muito mais
  • Sessões de coaching com especialistas do setor
  • Aprendizado entre pares e rede do setor
  • Assistência de carreira 360 graus

Uma das melhores plataformas de EdTech da atualidade, o upGrad continua a inspirar e preparar os alunos por meio de uma combinação de tecnologia de ponta, pedagogia mais recente, parcerias do setor e um corpo docente de classe mundial.

Aprenda cursos de ciência de dados online das melhores universidades do mundo. Ganhe Programas PG Executivos, Programas de Certificado Avançado ou Programas de Mestrado para acelerar sua carreira.

Por que o polimorfismo é usado em OOPs?

Em OOPs, polimorfismo é o método que executa diferentes tarefas com base na classe do objeto que o chama. Assim, uma mensagem é enviada para objetos de várias classes, e cada objeto responde de acordo com as propriedades da classe.

O que é sobrecarga de métodos em Java?

Em Java, dois ou mais métodos com o mesmo nome podem diferir em seus parâmetros (diferentes tipos de parâmetros, diferentes números de parâmetros ou ambos). Esses métodos são chamados de métodos sobrecarregados e o recurso é chamado de sobrecarga de métodos.

Qual é a diferença entre sobrecarga e sobreposição?

Quando dois ou mais métodos na mesma classe têm parâmetros diferentes, mas o mesmo nome, isso é chamado de sobrecarga. Por outro lado, a substituição é quando a superclasse e a classe filha têm a mesma assinatura de método (nome e parâmetros).