Języki programowania z programowaniem obiektowym
Transkrypt
Języki programowania z programowaniem obiektowym
Instytut Mechaniki i Inżynierii Obliczeniowej www.imio.polsl.pl fb.com/imiopolsl @imiopolsl Wydział Mechaniczny Technologiczny Politechnika Śląska Języki programowania z programowaniem obiektowym Laboratorium 14: Dziedziczenie Opracowali: dr hab. inż. Witold Beluch [email protected] dr inż. Jacek Ptaszny [email protected] Gliwice 2016 Języki programowania z programowaniem obiektowym. Laboratorium 14 1 1. Wprowadzenie Dziedziczenie to technika obiektowa, pozwalająca tworzyć nowe klasy na podstawie już istniejących klas. Jak pisze J. Grębosz w książce „Symfonia C++ standard”: „Dziedziczenie jest jedną z najwspanialszych cech obiektowo orientowanych języków programowania”. Zalety takiego podejścia to: 1. Oszczędność czasu: Załóżmy, że istnieje jakaś klasa, która „nie spełnia wszystkich oczekiwań”. Można ją poprzez dziedziczenie dopasować do naszych potrzeb tworząc na jej bazie tzw. klasę pochodną. Np. mając klasę Telewizor_LCD można na jej podstawie stworzyć klasę Telewizor_LCD_3D. Nie musimy znać kodu źródłowego klasy podstawowej (a tylko jej definicję w pliku .h) – możemy zatem korzystać z klas napisanych przez kogoś innego... 2. Stworzenie hierarchii klas: Często klasy są w pewnej logicznej zależności i tworzą „naturalną” hierarchię, np.: Zamiast osobnych klas mamy zatem sytuację: jakaś klasa jest szczególnym rodzajem innej klasy, np. Laptop i Stacjonarny są rodzajami czegoś takiego, jak Komputer. 2. Dziedziczenie Dziedziczenie pozwala na wykorzystanie tego, co istniejąca klasa już posiada i dostosowanie jej do innych potrzeb poprzez: - dodanie nowych danych składowych i funkcji składowych; - stworzenie nowych wariantów funkcji składowych lub ew. danych składowych. Np.: mając klasę Pralka: moglibyśmy chcieć stworzyć (postęp techniczny!) klasę Lepsza_Pralka, która posiada nową daną składową (dla uproszczenia np. tylko godzina): oraz zmodyfikowaną funkcję składową: Języki programowania z programowaniem obiektowym. Laboratorium 14 2 Przykładowa realizacja może wyglądać następująco: Wyjaśnienia: — Klasa Pralka jest w tym przypadku klasą podstawową dla klasy Lepsza_Pralka (Lepsza_Pralka jest w tym przypadku klasą pochodną klasy Pralka). — Nowa wersja funkcji składowej pranie „zastępuje” (zasłania) wersję funkcji pranie z klasy podstawowej. — Wyrażenie po dwukropku to lista pochodzenia. — Specyfikator public przy liście pochodzenia – o tym nieco później... Stwórzmy obiekt moja_nowa_pralka klasy Lepsza_Pralka: Wywołanie funkcji pranie dla obiektu klasy Lepsza_Pralka uruchamia funkcję klasy pochodnej: Jeśli chcemy wywołać funkcję pranie z klasy podstawowej, to należy skorzystać z kwalifikatora zakresu :: 2.1. Konstruktory Kolejność uruchamiania konstruktorów w przypadku dziedziczenia jest następująca: — najpierw uruchamiany jest konstruktor klasy podstawowej (starsi mają pierwszeństwo...); — w następnej kolejności wykonywane są konstruktory obiektów składowych klasy pochodnej (jeśli występują składowe obiekty innych klas); — dopiero na końcu uruchamiany jest konstruktor klasy pochodnej. Konstruktor klasy pochodnej jest zwykłym konstruktorem, przy czym na jego liście inicjalizacyjnej można (a często trzeba!) umieścić wywołanie konstruktora klasy podstawowej. Wywołanie takie można pominąć, jeśli: 1. klasa podstawowa nie ma żadnego konstruktora (więc nie ma czego wywołać...); 2. klasa podstawowa ma konstruktory a wśród nich jest konstruktor domyślny. 2.2. Dostęp do składników w warunkach dziedziczenia To, które dane i funkcje składowe klasy podstawowej będą dostępne i dla kogo określają stosowne etykiety. Dotychczas określając dostęp do danych składowych i funkcji składowych klasy korzystaliśmy z etykiet private oraz public. Oprócz tego istnieje etykieta protected. Składniki za taką etykietą są dostępne dla klas pochodnych (jak gdyby były public) a dla „całego świata” są niedostępne (jak gdyby były private). O dostępie do odziedziczonych składników decyduje też (w zakresie ograniczonym do składników public i protected – do danych prywatnych oczywiście nie ma dostępu!) klasa pochodna. Np.: w klasie Lepsza_Pralka jest to słowo public przed nazwą klasy podstawowej, co oznacza, że w tym przypadku nic się nie zmieni: — składniki public z klasy podstawowej będą nadal public; — składniki protected z klasy podstawowej będą nadal protected. Języki programowania z programowaniem obiektowym. Laboratorium 14 3 Jak to wygląda w innych przypadkach możesz znaleźć np. w wykładach do niniejszego przedmiotu. W ramach naszych rozważań ograniczymy się do wariantu public. Przykład: Czy wiesz, że... INTEGRATOR (eintegrator.com.pl) wspomaga zatrudnianie studentów i absolwentów zwłaszcza kierunków technicznych a także wymianę informacji dotyczących bieżącej działalności kół naukowych, organizacji studenckich i innych jednostek akademickich z przedsiębiorstwami specjalistycznymi powiązanymi branżowo celem nawiązania współpracy.