Jeśli potrafisz jeździć czterodrzwiowym samochodem podmiejskim, możesz również prowadzić pickupa. Jeśli prowadziłeś samochód z silnikiem spalinowym, możesz również prowadzić samochód elektryczny.
Kształt i wielkość pojazdów pasażerskich mogą się różnić w zależności od tego, czy jest to jeden z nich. Silnik, który napędza te pojazdy, również może być zupełnie inny. Ale to nie ma znaczenia dla kierowcy.
Po prostu wsiadasz, zapinasz pasy, uruchamiasz pojazd, wrzucasz bieg i jedziesz. To dlatego, że samochody, ciężarówki i furgonetki są polimorficzny.
Polimorfizm: rozbijanie
Spójrzmy na słowo polimorfizm. Możesz to rozbić na poli, przemieniać, oraz izm.
Poli oznacza wiele, jak wielokąt oznacza wiele kątów. Kiedy używany jako rzeczownik, a przemieniać jest odmianą gatunku. i izm może oznaczać system.
Zatem polimorfizm oznacza po prostu system wielu odmian. To jednak nadal nie mówi wiele o tym, jak jest używane w programowaniu. To jest następne.
Jeśli chodzi jak kaczka... Dlaczego obiekty polimorficzne są niesamowite
Kiedy tworzysz klasę w kodzie, która dziedziczy z innej klasy, wiążesz nową klasę z kontraktem. Umowa mówi, że każda zmienna i funkcja rodzica będzie również w dziecku.
Każdy pojazd posiada kierownicę, pedały gazu i hamulca oraz kierunkowskaz. Nie musisz otwierać maski, aby prowadzić samochód. Liczy się tylko to, że to samochód.
To samo dotyczy klas, które dziedziczą z innych klas. Oto przykład w TypeScript:
klasa Pojazd {
prywatny _silnik: ciąg;
prywatne _opony: liczba;
konstruktor (silnik: string = "spalanie", opony: liczba = 4) {
this._silnik = silnik;
this._opony = opony;
}
przyspieszenie (prędkość: liczba) {
console.log("przyspieszanie z prędkością " + prędkość);
}
hamulec (ciśnienie: liczba) {
console.log("nakładanie " + nacisk + " nacisk");
}
Skręć w lewo() {
console.log("skręcając w lewo");
}
Skręć w prawo() {
console.log("skręcając w prawo");
}
}
klasa Samochód rozszerza Pojazd {
}
klasa Tesla rozszerza samochód {
konstruktor() {
super("elektryczny");
}
}
W tym przykładzie występuje Pojazd klasa. ten Samochód klasa dziedziczy po Pojazd klasa. i Tesla dziedziczy z Samochód. Teraz stwórzmy kilka obiektów i spójrzmy na nie.
niech myCoupe: Car = new Vehicle();
console.log (myCoupe);
console.log (myCoupe.constructor.name);
let mySedan: Pojazd = nowa Tesla();
console.log (mySedan);
console.log (mySedan.constructor.name);
mójCoupe.turnLeft();
mójSedan.skręć w lewo();
Widać, że zadeklarowaliśmy mójCoupe być Samochód oraz mójSedan być Pojazd. Następnie stworzyliśmy instancję mójCoupe jako nowy Pojazd oraz mójSedan jako nowy Tesla. Jeśli ty odwiedź piaskownicę TypeScript i uruchom kod, zobaczysz, że działa bezbłędnie. I zachowuje się tak, jak można by oczekiwać, na podstawie umowy.
Innymi słowy, wszystkie pojazdy mogą skręcić w lewo, ponieważ odziedziczyły to po Pojazd klasa. Kompilator wie, że każde dziecko Pojazd zgodził się na umowę. Zakłada więc, że wszystko jest w porządku, bez względu na to, jakie klasy zostały wpisane lub utworzone jako egzemplarze obiektów.
Nazywa się to czasem „pisaniem kaczki”. Kompilator zakłada, że jeśli chodzi jak kaczka i mówi jak kaczka, to równie dobrze może to być kaczka. Więc kompilator nie przejmuje się szczegółami i po prostu traktuje obiekt jak kaczkę.
Polimorfizm sprawia, że Twój kod jest kuloodporny
Kolejną zaletą umowy polimorfizmu jest gwarancja, że Twój kod będzie działał. Jeśli mocno wpisałeś wszystkie zmienne i to, co zwraca każda funkcja, wiesz, że każde dziecko zawsze dopasuje zmienne, funkcje i typy.
Oznacza to, że możesz dodawać i zmieniać kod w swoich klasach bez łamania programu. Każdy obiekt, który odwołuje się do a Pojazd obiekt zawsze dostanie dane i funkcjonalność spełniającą oczekiwania, bez względu na to ile Samochód zmiany.
Kod wewnątrz funkcji może nie wyświetlać poprawnych wyników. Ale to inny problem. Dopóki funkcja postępuje zgodnie z umową i zwraca oczekiwany typ zmiennej, nie spowoduje błędu łamania kodu.
Polimorfizm jest ogromny i oto 10 innych zasad programowania, które powinieneś znać.
Ćwicz polimorfizm
- Użyj powyższego linku do piaskownicy, aby utworzyć Łódź klasa.
- Utwórz wystąpienie nowego obiektu łodzi w taki sposób, aby był Pojazd typ, ale nadal wygląda jak łódź.
- Upewnij się, że łódź nadal zachowuje się jak pojazd.
Jeden końcowy przykład polimorfizmu
Polimorfizm może być początkowo trudnym pojęciem do uchwycenia. Ale kiedy już to zrozumiesz, zrobiłeś ogromny krok w kierunku zrozumienia, o co tak naprawdę chodzi w programowaniu obiektowym. Koncepcja może jednak nadal wydawać się teoretyczna. Oto solidny przykład z prawdziwego świata, który pomoże Ci zobaczyć, jak bardzo jest to przydatne.
Wyobraź sobie, że tworzysz aplikację internetową, która łączy się z bazą danych MySQL. Wtedy szef postanawia przełączyć się na bazę danych PostgreSQL. Czy to oznacza, że musisz przepisać wszystkie wywołania bazy danych?
Nie, nie ma. Jeśli Twoja aplikacja używa Dostęp do danych klasa z podklasami, które faktycznie mieszają się z danymi, masz szczęście. ten Dostęp do danych class definiuje sposób interakcji aplikacji z danymi, a nie sposób interakcji z bazą danych.
Masz podklasy, takie jak MySQLAccess oraz PostgresQLDostęp które wykonują całą brudną robotę. Ale jeśli Twoja aplikacja ma tylko Dostęp do danych obiekty, możesz wymieniać bazy danych bez przepisywania ani jednego wiersza kodu aplikacji.
Właściwe programowanie obiektowe oznacza, że musisz wiedzieć o dziedziczeniu oraz o tym, jak może uprościć kodowanie i zmniejszyć liczbę błędów.
Czytaj dalej
- Programowanie
- Programowanie
- Programowanie obiektowe
Lee jest pełnoetatowym nomadą i erudytą z wieloma pasjami i zainteresowaniami. Niektóre z tych pasji obracają się wokół produktywności, rozwoju osobistego i pisania.
Zapisz się do naszego newslettera
Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!
Kliknij tutaj, aby zasubskrybować