Koncepcje obiektowe dla początkujących: wyjaśnienie polimorfizmu

Opublikowany: 2021-12-10

W językach wysokiego poziomu, takich jak Python i Java, programowanie OOP lub obiektowe odnosi się do organizacji projektowania oprogramowania wokół danych i obiektów, a nie logiki i funkcji. Obiekt definiuje się jako pole danych o unikalnych atrybutach i zachowaniu. Innymi słowy, OOP skupia się na obiektach, a nie na logice. Taki model programowania jest idealny dla dużych i złożonych programów wymagających aktywnych aktualizacji i konserwacji. Ponadto wprowadza do tabeli dodatkowe korzyści związane ze skalowalnością, wydajnością i możliwością ponownego wykorzystania kodu.

Programowanie OOP składa się z czterech podstawowych elementów konstrukcyjnych — polimorfizmu, enkapsulacji, abstrakcji i dziedziczenia. Ponieważ zakres naszego artykułu ogranicza się do polimorfizmu w obiektach obiektowych, omówimy szczegółowo polimorfizm, w tym przykłady polimorfizmu w Javie i polimorfizmu w Pythonie.

Ucz się kursów oprogramowania online z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.

Spis treści

Definicja polimorfizmu

Najprostszą definicją polimorfizmu byłoby to, że polimorfizm oznacza istnienie w różnych formach. Ma swoje korzenie w dwóch greckich terminach – „poly”, co oznacza „liczba” i „morf”, co przekłada się na „formy”.

Aby lepiej zrozumieć tę koncepcję, weźmy najpierw prosty przykład. Weźmy przykład zachowania kursora, tego samego kursora, który porusza się po ekranie za każdym razem, gdy używasz myszy lub gładzika. W zależności od działań użytkownika lub trybu programu, kursor może przybierać różne formy, takie jak strzałka, krzyżyk, linia lub palec wskazujący.

Polimorfizm jest jedną z najważniejszych cech OOP. W Javie i Pythonie zmienne, obiekty i funkcje mogą istnieć w wielu formach. W polimorfizmie podklasa lub metoda definiuje swoje atrybuty i zachowania, zachowując niektóre funkcje swojej klasy nadrzędnej. To prowadzi nas do dziedziczenia, które pozwala tworzyć hierarchie klas, w których klasa bazowa nadaje swoje atrybuty i zachowanie klasie pochodnej. Następnie funkcjonalności klasy pochodnej można dowolnie modyfikować lub rozszerzać zgodnie z wymaganiami. W tym celu polimorfizm zapewnia wykonanie poprawnej metody w oparciu o typ obiektu wywołującego.

Aby spojrzeć na to z innej perspektywy, załóżmy, że masz klasę, która wyświetla datę i godzinę. Teraz tworzysz metodę, która dziedziczy klasę i wyświetla komunikat „Hello!” wraz z datą i godziną.

Przykład polimorfizmu w Javie

Rozważmy nadklasę „Shapes”, która ma metodę „area()”. Podklasy w „Kształcie” mogą być „Prostokąt”, „Okrąg”, „Trójkąt” itp., a każda podklasa ma swoją metodę obliczania powierzchni. Stosując koncepcje dziedziczenia i polimorfizmu, podklasy wykorzystują metodę „area()” w celu znalezienia wzoru na obliczenie powierzchni odpowiedniego kształtu.

klasa Kształty {

publiczny pusty obszar () {

System.out.println("Formuła na obszar ");

}

}

class Trójkąt rozszerza Kształty {

publiczny pusty obszar () {

System.out.println("Trójkąt to 1/2 * podstawa * wysokość");

}

}

klasa Okrąg rozszerza Kształty {

publiczny pusty obszar () {

System.out.println("Okrąg ma 3.14 * promień * promień ");

}

}

klasa główna {

public static void main(String[] args) {

Kształty myShape = new Shapes(); // Utwórz obiekt Shapes

Kształty myTriangle = new Triangle(); // Utwórz obiekt trójkąta

Kształty myCircle = new Circle(); // Utwórz obiekt Circle

mójKształt.obszar();

mójtrójkąt.obszar();

mójKształt.obszar();

mójOkrąg.obszar();

}

}

Wynik powyższego kodu programu będzie następujący:

Wzór na obszar trójkąta to 1/2 * podstawa * wysokość

Wzór na obszar koła to 3,14 * promień * promień

Rodzaje polimorfizmu w obiektach obiektowych

Polimorfizm w obiektach OOP jest dwojakiego rodzaju – statyczny (polimorfizm czasu kompilacji) i dynamiczny (polimorfizm środowiska uruchomieniowego).

1. Polimorfizm statyczny

W Javie przeciążanie metod jest najczęstszym rodzajem statycznego polimorfizmu. Może tworzyć kilka metod o tej samej nazwie w ramach tej samej klasy, ale z różnymi parametrami. Zestawy parametrów muszą różnić się co najmniej jednym z następujących trzech kryteriów:

  • Metody muszą mieć różną liczbę parametrów.
  • Typy parametrów muszą być różne. Na przykład, jeśli jedna metoda akceptuje Long, druga akceptuje String.
  • Metody powinny przyjmować parametry w różnej kolejności. Na przykład, jeśli metoda 1 akceptuje Long i String, metoda druga musi akceptować String, a następnie Long.

W przypadku przeciążania metod podczas wywoływania metody kompilator wybiera, którą metodę należy wywołać na podstawie parametrów przekazanych podczas wywoływania. Odbywa się to w czasie kompilacji, a zatem ten typ polimorfizmu jest również określany jako polimorfizm w czasie kompilacji.

Poniżej znajduje się przykład kodu Java pokazujący polimorfizm w czasie kompilacji. W tym przykładzie metoda adds () jest przeciążona dwoma różnymi typami parametrów.

pakiet statycznyPolimorfizm;

Klasa publiczna Dodatek

{

void sum(int x, int y)

{

int c = x+y;

System.out.println("Dodanie dwóch liczb:" +c); }

void sum(int x, int y, int z)

{

int c = x+y+z;

System.out.println("Dodanie trzech liczb:" +c); }

public static void main(String[] args)

{

Obj dodawania = nowy Dodanie();

suma obj (45,34);

obj.sum(60, 32, 11);

}

}

Wynikiem powyższego programu będzie:

Dodanie dwóch liczb: 79

Dodanie trzech liczb: 103

2. Dynamiczny polimorfizm

Polimorfizm dynamiczny lub wykonawczy uzyskuje się poprzez nadpisywanie metody. W tym przypadku metody mają różne formy w różnych klasach (przesłanianie metod), a zamiast czasu kompilacji wywołanie zastąpionej metody jest rozwiązywane w czasie wykonywania. Teraz, po przypisaniu obiektu do odwołania do klasy i wywołaniu metody, wykonywana jest metoda z klasy obiektu. Ponieważ obiekt jest tworzony w czasie wykonywania, forma metody (w obiekcie), która ma zostać wykonana, jest ustalana dopiero w czasie wykonywania.

Poniżej znajduje się przykład kodu Java pokazujący polimorfizm środowiska wykonawczego . W tym przykładzie istnieje nadklasa „Zwierzę” i trzy podklasy: „kangur”, „tygrys” i „ryba”. Podklasy rozszerzają superklasę i przesłaniają jej metodę „move()”. Metoda „move()” jest wywoływana przez zmienną odniesienia klasy nadrzędnej „Animal”.

klasa zwierzę {

nieważny ruch () {

System.out.println("Przenoszenie zwierząt");

}

}

class kangur rozszerza Animal{

nieważny ruch () {

System.out.println("Skok kangurów");

}

}

klasa tygrysa rozszerza Animal{

nieważny ruch () {

System.out.println(„Spacer tygrysów”);

}

}

klasa ryby rozszerza Animal{

nieważny ruch () {

System.out.println("Płynięcie ryb");

}

}

klasa główna{

public static void main(String args[]){

Zwierzę A = nowe Zwierzę();

Zwierzę k = nowy kangur(); //wyrzucanie

Zwierzę t = nowy tygrys(); //wyrzucanie

Zwierzę f = nowa ryba(); //wyrzucanie

Ruch();

k.przenieś();

t.przenieś();

f.przenieś();

}

}

Wynikiem powyższego programu będzie:

Zwierzęta się poruszają

Kangury skaczą

Tygrysy chodzą

Ryby pływają

Polimorfizm w Pythonie

Polimorfizm w Pythonie ma trzy typy – polimorfizm operatorów, polimorfizm funkcji i polimorfizm klas. Python umożliwia również nadpisywanie metod, ale nie przeciążanie metod.

1. Polimorfizm operatora

W Pythonie operator „+” ma podwójne zastosowanie. Jest używany do operacji dodawania arytmetycznego w przypadku typów danych całkowitych, a dla łańcuchów operator „+” wykonuje konkatenacje.

Poniżej znajduje się przykład kodu Pythona, w którym operator „+” wykonuje dodawanie na typach danych całkowitych:

liczba1 = 4

liczba2 = 5

drukuj(num1+num2)

Wyjście powyższego kodu programu to „9”.

Poniżej znajduje się przykład kodu Pythona, w którym operator „+” wykonuje konkatenację typów danych typu string:

str1 = „Dobry”

str2 = „Wieczór”

print(str1+” „+str2)

Wynikiem powyższego programu będzie „Dobry wieczór”.

2. Polimorfizm funkcji

Funkcja „len()” w Pythonie jest zgodna z różnymi typami danych, takimi jak lista, ciąg, krotka, słownik i zestaw, ale zwraca określone informacje dla każdego typu danych. Oto przykład:

print(len("Programista"))

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

print(len({"Nazwa": "Kathy", "Adres": "Teksas"}))

Powyższy program będzie miał następujące wyjście:

9

3

2

3. Polimorfizm klas

Rozszerzając koncepcję polimorfizmu, Python pozwala wielu klasom mieć metody o tej samej nazwie. Poniżej podano przykład pokazujący polimorfizm w metodach klasowych w Pythonie. W przykładzie występują dwie klasy, „Kot” i „Pies”. Mają podobną strukturę i te same nazwy metod: make_sound() i info().

klasa Kot:

def __init__(self, name, age):

self.name = imię

własny.wiek = wiek

informacje o definicji (własne):

print(f”Jestem kotem. Nazywam się {self.name}. Mam {self.age} lat.”)

def make_sound(self):

print("Miau")

klasa Pies:

def __init__(self, name, age):

self.name = imię

własny.wiek = wiek

informacje o definicji (własne):

print(f”Jestem psem. Mam na imię {self.name}. Mam {self.age} lat.”)

def make_sound(self):

drukuj("Kora")

kot1 = Kot("Minnie", 3)

pies1 = Pies("Tomek", 6)

dla zwierząt w (cat1, dog1):

zwierzę.make_sound()

zwierzę.informacje()

zwierzę.make_sound()

Dane wyjściowe będą wyglądać następująco:

Miauczeć

Jestem kotem. Nazywam się Minnie. Mam 3 lata.

Miauczeć

Szczekać

Jestem psem. Mam na imię Tom. Mam 6 lat.

Szczekać

4. Nadpisywanie metody

Python umożliwia również klasom potomnym dziedziczenie atrybutów i metod z klasy nadrzędnej. Niektóre metody i atrybuty można przedefiniować, aby pasowały do ​​klasy potomnej (zastępowanie metody). Polimorfizm umożliwia następnie dostęp do przesłoniętych metod i atrybutów o tej samej nazwie co klasa nadrzędna.

Poniżej znajduje się przykład kodu Pythona ilustrujący nadpisywanie metod:

z matematyki importuj pi

klasa Kształt:

def __init__(self, name):

self.name = imię

obszar zdefiniowany (własny):

podawać

de facto (samo):

powrót „Jestem postacią zamkniętą”.

def __str__(samo):

zwróć self.name

klasa Kwadrat (kształt):

def __init__(self, length):

super().__init__("Kwadrat")

self.length = długość

obszar zdefiniowany (własny):

powrót self.length**2

de facto (samo):

return „Każdy kąt w kwadracie jest równy 90 stopniom”.

Koło klasy (kształt):

def __init__(samo, promień):

super().__init__("Okrąg")

self.radius = promień

obszar zdefiniowany (własny):

return pi*self.radius**2

a = Kwadrat(4)

b = Okrąg(7)

drukuj(b)

drukuj(b.fakt())

drukuj(a.fakt())

drukuj(b.obszar())

Powyższy program będzie miał następujące wyjście:

Koło

Jestem postacią zamkniętą.

Każdy kąt w kwadracie jest równy 90 stopniom.

153.93804002589985

Dowiedz się więcej o zastępowaniu metod.

Zalety polimorfizmu w obiektach obiektowych

Polimorfizm w obiektach obiektowych ma trzy istotne zalety. Są to:

  • Polimorfizm umożliwia ponowne wykorzystanie kodu. Dlatego po napisaniu, przetestowaniu i zaimplementowaniu klas można je wielokrotnie używać. Dodatkowo kod można zmienić bez wpływu na oryginalny kod. Wszystko to oszczędza koderowi znaczną ilość czasu.
  • W polimorfizmie wiele wartości danych może być przechowywanych w jednej zmiennej. Co więcej, wartość zmiennej dziedziczona z nadklasy do podklasy może być modyfikowana bez zmiany wartości zmiennej w nadklasie lub jakiejkolwiek podklasie.
  • Wreszcie polimorfizm działa z mniejszą liczbą wierszy kodu, co z kolei ułatwia programiście debugowanie.

Droga naprzód

upGrad, we współpracy z prestiżowym Liverpool John Moores University, oferuje rygorystyczny internetowy program Master of Science in Data Science dla pracujących profesjonalistów, którzy chcą zrobić karierę w nauce o danych. Kurs kończy się uzyskaniem tytułu magistra z LJMU oraz certyfikatem Executive PG Program z IIIT Bangalore.

Najważniejsze punkty programu:

  • Ponad 500 godzin treści, ponad 60 studiów przypadków i projektów, ponad 20 sesji na żywo
  • Kompleksowa oferta ponad 14 narzędzi i oprogramowania, takich jak Python, AWS, MySQL i nie tylko
  • Sesje coachingowe z ekspertami z branży
  • Uczenie się rówieśników i sieci branżowe
  • Pomoc w karierze 360 ​​stopni

Jedna z najlepszych dzisiejszych platform wyższych EdTech, upGrad nadal inspiruje i przygotowuje uczniów poprzez połączenie najnowocześniejszej technologii, najnowszej pedagogiki, partnerstw branżowych i światowej klasy wykładowców.

Ucz się online kursów nauki o danych z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.

Dlaczego polimorfizm jest używany w obiektach obiektowych?

W obiektach obiektowych polimorfizm to metoda, która wykonuje różne zadania w oparciu o klasę obiektu, która go wywołuje. W ten sposób wiadomość jest wysyłana do obiektów wielu klas, a każdy obiekt odpowiada zgodnie z właściwościami klasy.

Co to jest przeciążanie metod w Javie?

W Javie dwie lub więcej metod o tej samej nazwie może różnić się parametrami (różne typy parametrów, inna liczba parametrów lub obie). Takie metody są nazywane metodami przeciążonymi, a funkcja nazywana jest przeciążaniem metod.

Jaka jest różnica między przeciążaniem a nadpisywaniem?

Gdy dwie lub więcej metod w tej samej klasie ma różne parametry, ale tę samą nazwę, nazywa się to przeciążaniem. Z drugiej strony nadpisywanie ma miejsce, gdy nadklasa i klasa potomna mają tę samą sygnaturę metody (nazwa i parametry).