Concepte OOP pentru începători: Polimorfismul explicat

Publicat: 2021-12-10

În limbaje de nivel înalt, cum ar fi Python și Java, OOP sau programarea orientată pe obiecte se referă la organizarea de proiectare a software-ului în jurul datelor și obiectelor, mai degrabă decât a logicii și funcțiilor. Un obiect este definit ca un câmp de date cu atribute și comportament unic. Cu alte cuvinte, POO se concentrează mai degrabă pe obiecte decât pe logică. Un astfel de model de programare este ideal pentru programe mari și complexe care necesită actualizări active și întreținere. În plus, aduce la masă beneficiile suplimentare ale scalabilității, eficienței și reutilizabilității codului.

OOP are patru blocuri fundamentale – polimorfism, încapsulare, abstractizare și moștenire. Deoarece domeniul de aplicare al articolului nostru este limitat la polimorfism în OOP, vom discuta despre polimorfism în detaliu, inclusiv exemple de polimorfism în Java și polimorfism în Python.

Învață cursuri de software online de la cele mai bune universități din lume. Câștigă programe Executive PG, programe avansate de certificat sau programe de master pentru a-ți accelera cariera.

Cuprins

Polimorfism Definiție

Cea mai simplă definiție a polimorfismului ar fi aceea că polimorfismul înseamnă să existe sub diferite forme. Își are rădăcinile în doi termeni greci – „poli”, care înseamnă „numeroase” și „morf”, care se traduce prin „forme”.

Pentru a înțelege mai bine conceptul, să luăm mai întâi un exemplu simplu. Luați exemplul comportamentului cursorului, același cursor pe care îl vedeți mișcându-se pe ecran de fiecare dată când utilizați un mouse sau un trackpad. În funcție de acțiunile utilizatorului sau de modul programului, cursorul poate lua diferite forme, cum ar fi o săgeată, o cruce, o linie sau un deget arătător.

Polimorfismul este una dintre cele mai semnificative caracteristici ale OOP. În Java și Python, variabilele, obiectele și funcțiile pot exista în multe forme. În polimorfism, o subclasă sau o metodă își definește atributele și comportamentele, păstrând în același timp unele dintre funcționalitățile clasei sale părinte. Asta ne aduce la moștenire, care vă permite să creați ierarhii de clasă în care o clasă de bază își dă atributele și comportamentul unei clase derivate. Ulterior, funcționalitățile clasei derivate pot fi modificate sau extinse liber după cum este necesar. În acest scop, polimorfismul asigură că metoda corectă este executată în funcție de tipul obiectului apelant.

Pentru a o pune în perspectivă, să presupunem că aveți o clasă care afișează data și ora. Acum, creați o metodă care moștenește clasa și afișează mesajul „Bună ziua!” împreună cu data și ora.

Exemplu de polimorfism în Java

Luați în considerare superclasa „Forme” care are o metodă „area()”. Subclasele din „Formă” pot fi „Dreptunghi”, „Cerc”, „Triunghi” etc., iar fiecare subclasă are metoda sa de calcul a ariei. Aplicând conceptele de moștenire și polimorfism, subclasele folosesc metoda „area()” pentru a găsi formula de calcul a ariei formei respective.

clasa Forme {

zonă publică goală() {

System.out.println(„Formula pentru zona lui „);

}

}

clasa Triunghi extinde Forme {

zonă publică goală() {

System.out.println(„Triunghiul este 1/2 * bază * înălțime”);

}

}

clasa Cercul extinde Forme {

zonă publică goală() {

System.out.println(„Cercul este 3,14 * raza * raza “);

}

}

clasa principal {

public static void main(String[] args) {

Forme myShape = forme noi(); // Creați un obiect Forme

Forme triunghiul meu = triunghi nou(); // Creați un obiect Triunghi

Forme myCircle = new Circle(); // Creați un obiect Cerc

myShape.area();

myTriangle.area();

myShape.area();

myCircle.area();

}

}

Ieșirea codului de program de mai sus va fi după cum urmează:

Formula pentru aria triunghiului este 1/2 * bază * înălțime

Formula pentru aria cercului este 3,14 * rază * rază

Tipuri de polimorfism în POO

Polimorfismul în POO este de două tipuri – static (polimorfism în timp de compilare) și dinamic (polimorfism în timpul execuției).

1. Polimorfism static

În Java, supraîncărcarea metodei este cel mai comun tip de polimorfism static. Poate crea mai multe metode cu același nume în cadrul aceleiași clase, dar cu parametri diferiți. Seturile de parametri trebuie să difere în cel puțin unul dintre următoarele trei criterii:

  • Metodele trebuie să aibă un număr diferit de parametri.
  • Tipurile de parametri trebuie să fie diferite. De exemplu, dacă o metodă acceptă un Long, cealaltă acceptă un String.
  • Metodele ar trebui să accepte parametrii în ordine diferite. De exemplu, dacă metoda 1 acceptă un Long și un String, metoda doi trebuie să accepte un String și apoi un Long.

În supraîncărcarea metodei, în timpul apelării metodei, compilatorul alege ce metodă să apeleze pe baza parametrilor trecuți în timpul apelării. Acest lucru are loc în timpul compilării și, prin urmare, acest tip de polimorfism este denumit și polimorfism în timp de compilare.

Urmează un exemplu de cod Java pentru a arăta polimorfismul în timp de compilare. În acest exemplu, metoda adds () este supraîncărcată cu două tipuri diferite de parametri.

pachet staticPolymorphism;

Adăugarea de clasă publică

{

sumă nulă (int x, int y)

{

int c = x+y;

System.out.println(“ Adunarea a două numere :” +c); }

sumă nulă (int x, int y, int z)

{

int c = x+y+z;

System.out.println(“ Adunarea a trei numere :” +c); }

public static void main(String[] args)

{

Addition obj = new Addition();

suma obj. ( 45,34);

obj.sum(60, 32, 11);

}

}

Rezultatul programului de mai sus va fi:

Adunarea a două numere:79

Adunarea a trei numere: 103

2. Polimorfism dinamic

Polimorfismul dinamic sau de rulare se realizează prin suprascrierea metodei. Aici, metodele sunt în diferite forme în diferite clase (suprascrierea metodei), iar în loc de timp de compilare, apelul la o metodă suprascrisă este rezolvat în timpul execuției. Acum, la atribuirea unui obiect unei referințe de clasă și apelarea unei metode, metoda din clasa obiectului este executată. Deoarece obiectul este creat în timpul execuției, forma metodei (în obiect) care ar trebui să fie executată este decisă doar în timpul execuției.

Următorul este un exemplu de cod Java pentru a arăta polimorfismul de rulare . În exemplu, există o superclasă „Animal” și trei subclase, „cangur”, „tigru” și „pește”. Subclasele extind superclasa și suprascriu metoda „move()”. Metoda „move()” este apelată de variabila de referință a clasei părinte „Animal”.

clasa Animal{

void move(){

System.out.println(„Animalele se mută”);

}

}

clasa cangur se extinde Animal{

void move(){

System.out.println(„Saritura cangurilor”);

}

}

clasa tigrul extinde Animal{

void move(){

System.out.println(„Tigrii se plimbă”);

}

}

clasa de pește se extinde Animal{

void move(){

System.out.println(„Peștele înoată”);

}

}

clasa principala{

public static void main(Argumente șir[]){

Animal A = animal nou();

Animal k = cangur nou(); //upcasting

Animal t = tigru nou(); //upcasting

Animal f = pește nou(); //upcasting

O miscare();

k.mutare();

t.mutare();

f.mutare();

}

}

Rezultatul programului de mai sus va fi:

Animalele se mișcă

Cangurii sar

Tigrii merg

Peștii înoată

Polimorfismul în Python

Polimorfismul în Python este de trei tipuri - polimorfism operator, polimorfism de funcție și polimorfism de clasă. Python permite, de asemenea, suprascrierea metodei, dar nu supraîncărcarea metodei.

1. Polimorfismul operatorului

În Python, operatorul „+” are o utilizare dublă. Este folosit pentru operații de adunare aritmetică în cazul tipurilor de date întregi, iar pentru șiruri, operatorul „+” realizează concatenări.

Mai jos este un exemplu de cod Python în care operatorul „+” efectuează adăugare pe tipuri de date întregi:

num1 = 4

num2 = 5

print(num1+num2)

Ieșirea codului de program de mai sus este „9”.

Mai jos este un exemplu de cod Python în care operatorul „+” realizează concatenarea pe tipuri de date șir:

str1 = „Bine”

str2 = „Seara”

print(str1+” „+str2)

Rezultatul programului de mai sus va fi „Bună seara”.

2. Polimorfismul funcției

Funcția „len()” din Python este compatibilă cu diferite tipuri de date, cum ar fi listă, șir, tuplu, dicționar și set, dar returnează informații specifice pentru fiecare tip de date. Iată un exemplu:

print(len ("Programator"))

print(len([„Python”, „Java”, „C”))

print(len({„Nume”: „Kathy”, „Adresă”: „Texas”)))

Programul de mai sus va avea următorul rezultat:

9

3

2

3. Polimorfismul de clasă

Extinzând conceptul de polimorfism, Python permite ca mai multe clase să aibă metode cu același nume. Mai jos este un exemplu pentru a arăta polimorfismul în metodele de clasă în Python. În exemplu, există două clase, „Pisică” și „Câine”. Ele au o structură similară și au aceleași nume de metodă: make_sound(), și info().

clasa pisica:

def __init__(sine, nume, vârstă):

self.name = nume

self.age = varsta

def info(self):

print(f"Sunt o pisică. Numele meu este {self.name}. Am {self.age} ani.")

def make_sound(self):

print(„Miau”)

clasa caine:

def __init__(sine, nume, vârstă):

self.name = nume

self.age = varsta

def info(self):

print(f"Sunt un câine. Numele meu este {self.name}. Am {self.age} ani.")

def make_sound(self):

print(„latra”)

cat1 = Pisica(„Minnie”, 3)

câine1 = Câine(„Tom”, 6)

pentru animal în (cat1, dog1):

animal.make_sound()

animal.info()

animal.make_sound()

Ieșirea va fi după cum urmează:

miau

Sunt o pisica. Numele meu este Minnie. am 3 ani.

miau

Latra

Sunt un caine. Numele meu este Tom. am 6 ani.

Latra

4. Anularea metodei

Python permite, de asemenea, claselor copil să moștenească atribute și metode din clasa părinte. Anumite metode și atribute pot fi redefinite pentru a se potrivi cu clasa copil (suprascrierea metodei). Polimorfismul permite apoi accesul la metodele și atributele suprascrise cu același nume ca și clasa părinte.

Mai jos este un exemplu de cod Python pentru a ilustra suprascrierea metodei:

din matematica import pi

Forma clasei:

def __init__(self, name):

self.name = nume

def area(self):

trece

def fact(self):

return „Sunt o figură închisă”.

def __str__(self):

return self.name

clasa Pătrat (Formă):

def __init__(self, length):

super().__init__(„Pătrat”)

self.length = lungime

def area(self):

return self.lungime**2

def fact(self):

return „Fiecare unghi dintr-un pătrat este egal cu 90 de grade.”

clasa Cerc (Formă):

def __init__(self, radius):

super().__init__(„Cerc”)

self.radius = raza

def area(self):

return pi*self.raza**2

a = pătrat(4)

b = Cerc(7)

imprimare (b)

print(b.fact())

print(a.fapt())

print(b.zona())

Programul de mai sus va avea următorul rezultat:

Cerc

Sunt o figură închisă.

Fiecare unghi dintr-un pătrat este egal cu 90 de grade.

153.93804002589985

Aflați mai multe despre înlocuirea metodei.

Avantajele polimorfismului în POO

Polimorfismul în OOP are trei avantaje semnificative. Acestea sunt după cum urmează:

  • Polimorfismul permite reutilizarea codului. Prin urmare, odată ce clasele sunt scrise, testate și implementate, le puteți reutiliza din nou și din nou. În plus, codul poate fi modificat fără a afecta codul original. Toate acestea economisesc timp semnificativ pentru programator.
  • În polimorfism, mai multe valori de date pot fi stocate într-o singură variabilă. Mai mult, valoarea unei variabile moștenite de la o superclasă într-o subclasă poate fi modificată fără a modifica valoarea variabilei în superclasă sau în orice subclasă.
  • În cele din urmă, polimorfismul funcționează cu mai puține linii de cod, ceea ce, la rândul său, face depanarea mai ușoară pentru programator.

Pas înainte

upGrad, în parteneriat cu prestigioasa Universitatea John Moores din Liverpool, oferă un program riguros de master în știința datelor online. pentru profesioniștii care aspiră să facă o carieră în știința datelor. Cursul se încheie cu o diplomă de master de la LJMU și o certificare Executive PG Program de la IIIT Bangalore.

Repere ale programului:

  • Peste 500 de ore de conținut, peste 60 de studii de caz și proiecte, peste 20 de sesiuni live
  • Acoperire cuprinzătoare a peste 14 instrumente și software, cum ar fi Python, AWS, MySQL și multe altele
  • Sesiuni de coaching cu experți din industrie
  • Învățare între egali și rețea industrială
  • Asistență în carieră la 360 de grade

Una dintre cele mai bune platforme EdTech de astăzi, upGrad continuă să inspire și să pregătească cursanții printr-o combinație de tehnologie de ultimă oră, cea mai recentă pedagogie, parteneriate în industrie și o facultate de clasă mondială.

Învață cursuri de știință a datelor online de la cele mai bune universități din lume. Câștigă programe Executive PG, programe avansate de certificat sau programe de master pentru a-ți accelera cariera.

De ce este folosit polimorfismul în POO?

În POO, polimorfismul este metoda care realizează diferite sarcini în funcție de clasa obiectului care îl numește. Astfel, un mesaj este trimis obiectelor din mai multe clase și fiecare obiect răspunde în funcție de proprietățile clasei.

Ce este supraîncărcarea metodelor în Java?

În Java, două sau mai multe metode care au același nume pot diferi în parametrii lor (diferiți tipuri de parametri, numere diferite de parametri sau ambele). Astfel de metode se numesc metode supraîncărcate, iar caracteristica se numește supraîncărcare a metodei.

Care este diferența dintre supraîncărcare și suprascriere?

Când două sau mai multe metode din aceeași clasă au parametri diferiți, dar același nume, se numește supraîncărcare. Pe de altă parte, suprascrierea este atunci când superclasa și clasa copil au aceeași semnătură de metodă (nume și parametri).