Czym jest polimorfizm?
|
|
- Bartosz Smoliński
- 6 lat temu
- Przeglądów:
Transkrypt
1 Metody wirtualne oraz metody abstrakcyjne są ściśle związane z mechanizmem polimorfizmu. Polimorfizm jest jednym z filarów paradygmatu programowania obiektowego. Jak wiadomo język C# jest w całości językiem obiektowym, dlatego tak ważne jest aby zapoznać się z jego podstawowymi konstrukcjami. Dowiesz się także, kiedy lepiej wybrać metodę wirtualną a kiedy abstrakcyjną. Czym jest polimorfizm? Na początku trochę suchej teorii. Polimorfizm jest jednym z czterech podstawowych założeń programowania obiektowego. Opisując najprościej, polimorfizm polega na zdolności obiektu do różnych zachowań zależnie od bieżącego wykonania programu. Polimorfizm to filar programowania obiektowego. Polega na różnym zachowaniu tych samych metod polimorficznych (o tych samych deklaracjach) w klasach będących w relacji dziedziczenia. Metodami polimorficznymi (czyli obsługującymi mechanizm polimorfizmu) są w C# metody wirtualne oraz metody abstrakcyjne. Do powyższej definicji polimorfizmu można się przyczepić, stricte definiuje ona polimorfizm dynamiczny. Oprócz tego w C# występuje także polimorfizm statyczny. Jednak to właśnie wiązania dynamiczne są sednem polimorfizmu, dlatego zdecydowałem się uogólnić definicję właśnie dla tego typu wielopostaciowości. Więcej szczegółów znajdziesz w kolejnych akapitach. Komu i po co to potrzebne? Jednym przeznaczeniem polimorfizmu jest znaczne Karol Trybulec p-programowanie.pl 1
2 skrócenie i uproszczenie kodu programu. Więcej na ten temat w kolejnych akapitach. Polimorfizm statyczny w C# Polimorfizmem statycznym w C# jest przeciążanie funkcji i operatorów. W tej samej klasie może istnieć wiele metod o tej samej nazwie, różniących się tylko parametrami. Nie jest to zaskakujące, jednak warto wiedzieć, że przeciążanie także nazywane jest polimorfizmem. W tym artykule nie będę tego opisywał, jest to dobry temat na osobny wpis. Polimorfizm statyczny zachodzi podczas kompilacji programu. Nie mamy wpływu na zachowanie metod podczas działania aplikacji. To, która metoda zostanie wybrana jest postanowione już na etapie komplikacji i zależy od ilości przekazanych do metody argumentów. Polimorfizm dynamiczny w C# Polimorfizm dynamiczny w C# to przesłanianie funkcji. Jest to aspekt, który najbardziej nas interesuje. Rzadko używane jest pojęcie polimorfizmu dynamicznego, przeważnie pisze się tylko polimorfizm i takiej terminologii będę się dalej trzymał. Polimorfizm został opisany w akapicie wyższej. Co należy zapamiętać, aby włączyć mechanizm polimorfizmu, musimy w danej klasie utworzyć dowolną metodę polimorficzną. Na metody polimorficzne składają się metody wirtualne oraz metody abstrakcyjne (czysto wirtualne). Metody abstrakcyjne są przesłaniane, dzięki temu osiąga się wielopostaciowość interfejsu polimorficznego w obrębie klas znajdujących się w relacji dziedziczenia. Metody polimorficzne przesłania się słowem kluczowym override. Używanie terminu przysłanianie zamiast przesłanianie w terminologii paradygmatu programowania obiektowego jest błędne (a niestety często spotykane). Interfejs polimorficzny Ściśle z polimorfizmem związane jest pojęcie interfejsu polimorficznego. Dla danego związku klas będących w relacji dziedziczenia, tworzymy jeden interfejs polimorficzny i osiągamy różne zachowanie tych samych metod, narzuconych przez interfejs. Nie jest to artykuł o interfejsach występujących w C#, jednak czym one w ogóle są? Interfejsy to umowa, mówiąca jakie metody musi zaimplementować klasa rozszerzająca dany interfejs. Karol Trybulec p-programowanie.pl
3 Interfejs polimorficzny to umowa, mówiąca jakie metody polimorficzne muszą implementować klasy pochodne. Dzięki temu grupa klas posiada jeden interfejs polimorficzny ale wiele tych samych metod o różnych zachowaniach (wielopostaciowość metod polimorficznych). Przykładowo, możemy utworzyć interfejs polimorficzny dla klasy Pracownik. Jedną z metod klasy będzie metoda Pracuj(). Z klasy pracownik będzie dziedziczyła klasa Szef i Sekretarka. Metoda Pracuj() będzie się zachowywać inaczej dla każdej klasy pochodnej, a to jak będzie się zachowywać będzie zależało od typu statycznego obiektu, na rzecz którego jest wywoływana. Uwaga! Nie można mylić interfejsu polimorficznego ze zwykłym interfejsem w języku C#. Interfejs to konstrukcja programistyczna deklarowana słowem interface, a interfejs polimorficzny to zbiór metod polimorficznych (wirtualnych i abstrakcyjnych) występujących w klasie bazowej, których implementacją obarczamy klasy pochodne. Przesłanianie zwykłych metod Cała idea wielopostaciowości kręci się w okół dziedziczenia klas oraz przesłaniania metod. Przesłanianie metod wywodzi się z polimorfizmu dynamicznego. W przypadku zwykłego przesłonięcia metody, kompilator ostrzega nas i pyta, czy jest to aby na pewno efekt przez nas pożądany: 1 public class Pracownik public void Pracuj() Console.WriteLine("Pracownik.Pracuj()"); public class Sekretarka : Pracownik //przesłonięcie metody public void Pracuj() Console.WriteLine("Sekretarka.Pracuj()"); Kod się kompiluje jednak występuje ostrzeżenie: Warning Sekretarka.Pracuj() hides inherited member Pracownik.Pracuj(). Use the new keyword if hiding was intended. Aby pozbyć się ostrzeżenia, wystarczy w linijce nr. dodać słowo kluczowe new. Jedynym zadaniem new jest powiadomienie kompilatora, że przesłaniamy funkcję niepolimorficzną świadomie. Takie przesłanianie niepolimorficznych funkcji nie jest poprawne, przeważnie oznacza błędnie Karol Trybulec p-programowanie.pl
4 zaprojektowany program. Jakie są skutki takiego przesłonięcia funkcji? W przypadku rzutowania klasy pochodnej na typ klasy bazowej, zostanie wywołana metoda typu statycznego: public class Pracownik public void Pracuj() Console.WriteLine("Pracownik.Pracuj()"); public class Sekretarka : Pracownik // dodanie new usuwa ostrzeżenie kompilatora // jednak new nie jest wymagane - nic nie zmienia new public void Pracuj() Console.WriteLine("Sekretarka.Pracuj()"); static void Main(string[] args) Pracownik p = new Sekretarka(); p.pracuj(); // zwraca: Pracownik.Pracuj(); Console.ReadKey(); Od teraz, trzymaj się takich konstrukcji programistycznych z daleka. Na początku zapewne nie dostrzegasz wad tego rozwiązania, jednak zrozumiesz je w dalszych akapitach. Podstawową z takich wad jest znaczące powielanie kodu. W tym momencie wkracza polimorfizm. Aby korzystać z jego zalet, będziemy przesłaniać metody polimorficzne, co jest opisane w następnym akapicie. Metody polimorficzne i przesłanianie metod W C# istnieją dwa typy metod polimorficznych, które uruchamiają mechanizm polimorfizmu. Są to metody wirtualne oraz metody abstrakcyjne. Ich przedrostki dopisujemy do dowolnej metody danej klasy. Niżej są one omówione bardziej szczegółowo: Metody wirtualne Metoda wirtualna w C# jest metodą polimorficzną. Jest to funkcja składowa dowolnej klasy oznaczona słowem kluczowym virtual. Metoda wirtualna (funkcja wirtualna) jest metodą składową klasy, której wywołanie zależy Karol Trybulec p-programowanie.pl
5 od typu dynamicznego obiektu. Jej użycie włącza mechanizm polimorfizmu dynamicznego. Metodę wirtualną tworzy się w klasie bazowej. We wszystkich klasach pochodnych można polimorficznie przesłonić jej nazwę i zapewnić jej inną implementację. 1 public class Pracownik // metoda wirtualna virtual public void Pracuj() Console.WriteLine("Pracownik.Pracuj()"); Jaka jest różnica między metodą wirtualną a zwykłą? Różnica polega na zachowaniu wywoływania przesłoniętych metod podczas dziedziczenia klas. Rozważmy przykład znany z akapitu o przesłanianiu metod, wzbogacony o funkcję wirtualną: public class Pracownik // funkcja wirtualna virtual public void Pracuj() Console.WriteLine("Pracownik.Pracuj()"); public class Sekretarka : Pracownik // przesłaniamy override public void Pracuj() Console.WriteLine("Sekretarka.Pracuj()"); static void Main(string[] args) Pracownik p = new Sekretarka(); p.pracuj(); // UWAGA! zwraca: Sekretarka.Pracuj(); Console.ReadKey(); W przypadku przesłonięcia metody niewirtualnej, zostanie wywołana metoda typu statycznego wskazywanego przez referencję, czyli metoda z klasy Pracownik. Ponieważ użyliśmy metody wirtualnej (polimorficznej), mimo rzutowania instancji klasy Sekretarka na typ bazowy Pracownik, wywołana zostaje metoda wirtualna klasy Sekretarka. Występuje tutaj zależność od typu dynamicznego, a nie statycznego jak w przypadku zwykłego przesłaniania. Zauważ! Metoda klasy bazowej jest wirtualna. Nie musimy jej przesłaniać, ale jeżeli Karol Trybulec p-programowanie.pl
6 chcemy to musimy to zrobić za pomocą słowa kluczowego override. Kilka wniosków na temat metod wirtualnych metody, która nie jest wirtualna, nie można przesłonić poprzez użycie override metody statyczne ani prywatne nie mogą być wirtualne metoda wirtualna może być przesłonięta w klasie pochodnej ale nie musi. W przypadku braku przesłonięcia zostanie wywołana metoda klasy bazowej Najważniejszą cechą metod wirtualnych, jest ta opisana wyższej. Nie jesteśmy zmuszeni do przesłonięcia metody wirtualnej w klasie bazowej. Jest to główna różnica w stosunku do metod abstrakcyjnych. Każda klasa w C# dziedziczy niejawnie z klasy Object, która z kolei udostępnia kilka metod wirtualnych. 1 public class Object /* składowe wirtualne */ virtual public bool Equals(object o); virtual protected void Finalize(); virtual public string ToString(); /* itp.. */ Dzięki temu, możesz zawsze je nadpisać za pomocą override, nawet jeżeli jawnie nie rozszerzasz Object. Ponieważ to metody wirtualne, nie musisz ich przesłonić. W przypadku braku przesłonięcia zostanie wywołana implementacja domyślna z kasy bazowej Object. Metody abstrakcyjne Metoda abstrakcyjna w C# jest metodą polimorficzną. Musi być zadeklarowana jako funkcja składowa abstrakcyjnej klasy, poprzedzona przedrostkiem abstract. Metoda abstrakcyjna zachowuje się dokładnie tak samo jak metoda wirtualna, jedyna różnica leży w braku definicji ciała funkcji. Tworząc metodę abstrakcyjną deklarujesz funkcję (deklaracja to typ zwracany, nazwa i argumenty) ale nie definiujesz ciała funkcji. Metodę abstrakcyjną można zadeklarować tylko w klasie abstrakcyjnej (także poprzedzonej słowem abstract). Dlaczego tak jest? Klasa abstrakcyjna jest klasą, której instancji nie da się stworzyć. Można po niej tylko dziedziczyć, rozszerzając ją o inne klasy. Klasy dziedziczące muszą implementować metody abstrakcyjne klasy abstrakcyjnej. Gdyby Karol Trybulec p-programowanie.pl
7 dało się utworzyć instancję klasy abstrakcyjnej, doszło by do sytuacji, że istnieje w niej abstrakcyjna funkcja bez definicji ciała. Za zdefiniowanie ciała funkcji abstrakcyjnej odpowiedzialne są klasy pochodne. Odbywa się to poprzez przesłanianie słowem override tak samo jak w funkcjach wirtualnych. Krótki przykład: abstract public class Pracownik // funkcja abstrakcyjna, bez ciala funkcji(!) abstract public void Pracuj(); public class Sekretarka : Pracownik // przesłaniamy override public void Pracuj() Console.WriteLine("Sekretarka.Pracuj()"); static void Main(string[] args) Pracownik p = new Sekretarka(); p.pracuj(); // UWAGA! zwraca: Sekretarka.Pracuj(); Console.ReadKey(); Warto dodać, że klasa abstrakcyjna może posiadać zwykłe metody, posiadające ciało funkcji mimo posiadania metod abstrakcyjnych. Cała reszta działa tak samo jak w funkcjach wirtualnych. Wywoływana jest przesłonięta metoda, biorąc pod uwagę typ dynamiczny. Podsumowanie metod abstrakcyjnych działają tak samo jak funkcje wirtualne, oprócz tego że nie podaje się definicji ciała funkcji w klasie bazowej muszą być zadeklarowane w klasie abstrakcyjnej nie mogą być prywatne ani statyczne klasa pochodna musi przesłonić wszystkie metody abstrakcyjne Kiedy używać metod wirtualnych a kiedy abstrakcyjnych? Zarówno metody abstrakcyjne jak i metody wirtualne są polimorficzne i prawie niczym się nie różnią. Nasuwa się więc pytanie: kiedy używać jednych a kiedy drugich? Odpowiedź Karol Trybulec p-programowanie.pl
8 na to pytanie jest prosta. Metod wirtualnych używamy wszędzie tam, gdzie może wystąpić powielanie kodu w przesłanianych funkcjach. Dlaczego? Używając polimorfizmu i metod wirtualnych, możemy wywołać po typie dynamicznym metodę wirtualną klasy pochodnej (domyślnie), a jeśli zechcemy także metodę klasy pochodnej i bazowej. Odbywa się to dzięki słowu kluczowemu base odnoszącemu się do klasy bazowej. Prosty przykład: public class Pracownik // funkcja wirtualna virtual public void Pracuj() Console.WriteLine("Autoryzacja"); Console.WriteLine("Sprawdź zlecenia"); public class Sekretarka : Pracownik // przesłaniamy override public void Pracuj() base.pracuj(); Console.WriteLine("Obowiazki sekretarki"); static void Main(string[] args) Pracownik p = new Sekretarka(); p.pracuj(); //Autoryzacja //Sprawdz zlecenia //Obowiazki sekretarki Console.ReadKey(); W przykładzie wyżej, każdy pracownik przed rozpoczęciem pracy musi przejść proces autoryzacji a następnie sprawca zlecenia na dziś. Dopiero po tym etapie zaczyna właściwe dla swojego stanowiska obowiązki. Jeżeli stworzylibyśmy reprezentację klas dla dużej ilości pracowników, błędem byłoby użycie metody abstrakcyjnej. Doskonale za to naddaje się tutaj metoda wirtualna, ponieważ zapobiegamy powielaniu kodu. Obowiązki wspólne dla każdego pracownika są Karol Trybulec p-programowanie.pl
9 wywoływane z metody wirtualnej klasy bazowej, a specjalistyczne obowiązki poszczególnych stanowisk dopiero później przesłaniając funkcję wirtualną. Odwrotnie wygląda sprawa z metodami abstrakcyjnymi. Jeżeli masz pewność, że nie zajdzie zjawisko powielania kodu, możesz ich użyć. Przykładowy program dotyczący figur geometrycznych: abstract public class Figura protected int a,b,c; abstract public int Pole(); public class Kwadrat : Figura override public int Pole() return a*a; public class Trojkat : Figura override public int Pole() return 1/*a*b; W tym przykładzie użycie metody wirtualnej nie miałoby sensu. Pole powierzchni dla każdej figury liczy się zupełnie inaczej, więc wygodnie nam było użyć metody abstrakcyjnej. Dzięki temu mamy pewność, że klasa pochodna musi dostarczyć własną definicję ciała metody Pole(). W przypadku metod wirtualnych klasa pochodna nie musi przesłonić metody klasy bazowej. Polimorfizm w C++, C# i Javie Polimorfizm występuje we wszystkich obiektowych językach programowania. Generalnie zawsze polega on na tym samym wielopostaciowości przesłanianych metod wirtualnych. Małe różnice występują natomiast w specyficznych elementach danego języka. C++ vs C# W języku C++ uruchamiamy polimorfizm dodając do klasy dowolną funkcję wirtualną. W klasach pochodnych przesłaniamy funkcję, jednak nie poprzedzamy jej już żadnym słowem kluczowym. W C# konieczne jest dodanie override. W C++ dopuszczalne jest dopisanie Karol Trybulec p-programowanie.pl
10 virtual jednak nie jest to wymagane, a skoro nie jest to wiadomo nie dopisujemy. Kod w C class Pracownik public: virtual void Pracuj() cout << "Pracownik -> Pracuj()" << endl; ; class Sekretarka : public Pracownik public: void Pracuj() cout << "Sekretarka -> Pracuj()" << endl; ; int main() Pracownik* p = new Sekretarka(); p->pracuj(); W języku C++ nie ma interfejsów ani metod abstrakcyjnych, są za to metody czysto wirtualne. Jeżeli klasa posiada jakąkolwiek metodę czysto wirtualną, przyjmujemy, że staje się umownie klasą abstrakcyjną. Kod w C class Pracownik public: // metoda czysto wirtualna virtual void Pracuj() = ; ; class Sekretarka : public Pracownik public: // musimy zaimplementować(!) void Pracuj() cout << "Sekretarka -> Pracuj()" << endl; ; int main() Pracownik* p = new Sekretarka(); p->pracuj(); W tym przypadku musimy zaimplementować metodę czysto wirtualną. Zwykłej metody Karol Trybulec p-programowanie.pl
11 wirtualnej oczywiście nie musimy. Zwykła metoda wirtualna w C++ zachowuje się jak metoda wirtualna z C#. Natomiast metoda czysto wirtualna z C++ zachowuje się jak metoda abstrakcyjna z C#. Warto zapamiętać: w C++ nie występują klasy wirtualne, ponieważ nie występuje konstrukcja pozwalająca poprzeć słowa class słowem abstract. Nie występują także interfejsy. Programiści przyjęli, że definiując w C++ klasę z funkcjami czysto wirtualnymi oraz funkcjami normalnymi osiągamy twór na wzór klasy abstrakcyjnej. Tworząc natomiast klasę zawierającą tylko funkcje wirtualne otrzymujemy twór na wzór interfejsu. Java vs C# Java niczym szczególnym nie różni się od C#. W Javie wszystkie funkcje domyślnie są wirtualne. Są dostępne interfejsy i metody abstrakcyjne, które także są domyślnie wirtualne. Kod w Java class Pracownik public void Pracuj() System.out.print("Pracownik.Pracuj()"); class Sekretarka extends Pracownik public void Pracuj() System.out.print("Sekretarka.Pracuj()"); public class Main public static void main(string[] args) Pracownik p = new Sekretarka(); p.pracuj(); Chociaż wirtualna maszyna Javy i odśmiecacz pamięci działają bardzo dobrze, wciskanie polimorfizmu wszędzie tam gdzie nie jest potrzebny, nawet do najprostszych programów często odbija się na wydajności. Mimo tego programiści C# nie odczują dużej różnicy przesiadając się na Javę, przynajmniej w przypadku tego aspektu. Chcąc wyłączyć polimorfizm przesłonić funkcję tak jak w C# za pomocą operatora new, jesteśmy zmuszeni w klasie bazowej zadeklarować funkcję jako prywatna. Karol Trybulec p-programowanie.pl 11
12 Przykłady użycia polimorfizmu Istnieją setki przykładów na użycie polimorfizmu, można wymyślać je bez końca. Pokażę tutaj dwie duże zalety i ich reprezentację w kodzie. Obydwie skupiają się przede wszystkim na znacznym skróceniu kodu programu. Sztandarowy przykład to wywoływanie metod klas zebranych w kolekcji lub tablicy. Dzięki zastosowaniu polimorfizmu wywołujemy metodę polimorficzną związaną z typem statycznym. Dzięki dziedziczeniu, które jest drugim filarem programowania obiektowego, możemy klasy pochodne rzutować na referencję klasy bazowej. Dzięki temu powstają potężne konstrukcje jak np. ta: public class Pracownik virtual public void Pracuj() Console.WriteLine("Pracownik pracuje"); public class Sekretarka : Pracownik override public void Pracuj() Console.WriteLine("Sekretarka pracuje"); public class Ochroniarz : Pracownik override public void Pracuj() Console.WriteLine("Ochroniarz pracuje"); public class Ksiegowy : Pracownik override public void Pracuj() Console.WriteLine("Księgowy pracuje"); static void Main(string[] args) List<Pracownik> lista = new List<Pracownik>(); lista.add(new Sekretarka()); lista.add(new Ochroniarz()); lista.add(new Ksiegowy()); foreach (var i in lista) // hurtowo wszystkich zaganiamy do pracy i.pracuj(); Console.ReadKey(); W konstrukcji foreach możemy jedną linijką kodu wywołać metody dla wielu różnych klas, wywodzących się z jednej klasy bazowej. Karol Trybulec p-programowanie.pl 1
13 Kolejnym przykładem jest przekazywanie klasy pochodnej do różnych specjalistycznych metod. Dzięki użyciu polimorfizmu możemy dopuścić się następującej konstrukcji: 1 public void JakasMetoda(Pracownik p) p.jakasoperacja(); Bez użycia funkcji wirtualnych metoda musiałaby wyglądać następująco: 1 public void JakasMetoda(Pracownik p) if (p is Sekretarka) jakasoperacjaa(); else if (p is Ksiegowy) jakasoperacjab(); else if (p is Ochroniarz) jakasoperacjac(); Prawda, że kod jest o wiele dłuższy? Zastosowanie polimorfizmu w programowaniu Początkującym programistom ciężko zrozumieć gdzie można zastosować polimorfizm. Oprócz podstawowych przykładów, które pokazałem w poprzednim akapicie, ciężko wymyślić coś bardziej spektakularnego. Biorąc pod uwagę konieczność dodatkowej logiki jaka wiąże się z użyciem polimorfizmu można odnieść wrażenie, że po prostu lepiej odpuścić. Może lepiej dodać kilka instrukcji warunkowych więcej, zamiast martwić się w przesłanianie metod? Zaczynając od fundamentów musisz wiedzieć, że podstawowe filary programowania obiektowego to: polimorfizm dziedziczenie hermetyzacja abstrakcja W paradygmacie programowania obiektowego chodzi o to, aby modelować system i zachodzące w nim procesy w formie reużywalnych obiektów (bytów). Jest to proces bardzo trudny. Popełnienie błędów lub nieprzewidzenie pewnych rzeczy w początkowej fazie projektowania systemu będzie rzutować na cały okres jego życia (i nawiasem mówiąc będzie prowadzić do jego końca). Obiekty muszą być jak najbardziej reużywalne i niezależne, Karol Trybulec p-programowanie.pl 1
14 po to aby dało się je ponownie wykorzystać. Mówimy wtedy, że kod programu jest wysoce skalowalny. To z kolei skutkuje łatwością rozwijania i utrzymywania kodu. Duże systemy pisanie obiektowo przez kilka lat przez kilkudziesięciu programistów mają duży problem z osiągnięciem tej skalowalności i odpowiedniej jakości kodu. Miarą jakości kodu są odpowiednie metryki, jednak opisywanie ich to temat na osoby artykuł. Aby wyjść naprzeciw oczekiwaniom programistów i usprawnić programowanie obiektowe pewna grupa ludzi wymyśliła wzorce projektowe. Są oni nazywani tzw. gangiem czworga. Ich książka jest podstawową lekturą, każdego początkującego programisty, ponieważ umiejętność korzystania ze wzorców projektowych do fundament w efektywnym programowaniu obiektowym. Teraz dochodzimy do miejsca, gdzie użycie i rozumienie polimorfizmu jest niezbędne, czyli do wzorców projektowych. Wzorce projektowe są gotowymi rozwiązaniami na najbardziej powszechne problemy występujące w programowaniu obiektowym. Bez polimorfizmu nie byłoby wzorców projektowych. Jeżeli masz jakikolwiek problem ze zrozumieniem polimorfizmu lub dziedziczenia z całą pewnością nie będziesz też w stanie zrozumieć wzorców. Programowanie bez użycia polimirfozmu Popatrzmy na problem od drugiej strony. Załóżmy, że nie chcesz używać wzorców projektowych i nie chcesz używać polimorfizmu. Czy da się w ten sposób napisać duży system? Oczywiście! O ile będzie to system pisany przez jedną osobę i w momencie jego pisania znamy całą jego specyfikację (wiemy, jak system ma działać). W takim wypadku kod programu zaczyna bardziej przypominać kod deklaratywny i to w formie strukturalnej (wykonanie instrukcja po instrukcji), przeplatany setkami instrukcji warunkowych. Nawet gdy użyjemy w nim klas i posłużymy się językiem obiektowym, z obiektowością nie miałby to dużo wspólnego. Obliczenie jakichkolwiek metryk dla takiego kodu zwróciłoby fatalne wartości, ponieważ bez polimorfizmu nie jesteśmy w stanie stworzyć reużywalnych obiektów. Wszędzie występowałoby duże powiązanie klas. Podsumowując, nie ma obowiązku używania polimorfizmu, jednak musimy go używać chcąc skorzystać ze wzorców. Bez nich nigdy nie będziemy programować obiektowo, a kod wcześniej czy później będzie przypominał bubla. Oczywiście wszelkie te rozważania mają sens w paradygmacie programowania obiektowego. W programowaniu logicznym lub funkcyjnym wszystko działa inaczej, inaczej modeluje się działanie programu. Karol Trybulec p-programowanie.pl 1
15 Zaawansowane dziedziczenie i polimorfizm Zadania dotyczące polimorfizmu i nadpisywania funkcji zawsze pojawiają się na rozmowach kwalifikacyjnych. Dlatego warto dobrze przyswoić sobie ten temat. Jeżeli doczytałeś artykuł do tego momentu, polimorfizm może wydawać Ci się prosty. Nic bardziej mylnego! W tym akapicie udowodnię Ci, że istnieje wiele konstrukcji programistycznych w których bardzo łatwo się pogubić! Język C# nie pozwala na dziedziczenie z wielu klas bazowych i bardzo dobrze, eliminuje to wiele dodatkowych problemów (ang. the diamond inheritance problem). Mimo tego działanie mechanizmu polimorfizmu jest oczywiste tylko w przypadku powiązania relacją dziedziczenia dwóch klas. W przypadku dziedziczenia z wielu klas bazowych, zawierających metody wirtualne i abstrakcyjne sytuacja zaczyna się komplikować (ang. inheritance chain problem). Gdy dodatkowo przepleciemy je zwykłymi metodami, oraz metody wirtualne zaczną wywoływać inne metody wirtualne łatwo się zgubić. Rozważmy przykład: Karol Trybulec p-programowanie.pl 1
16 public class A public void NormalFun() Console.WriteLine("A NormalFun()"); public virtual void VirtualFun() Console.WriteLine("A VirtualFun()"); VirtualFun(); public virtual void VirtualFun() Console.WriteLine("A VirtualFun()"); public class B : A public void NormalFun() Console.WriteLine("B NormalFun()"); public virtual void VirtualFun() Console.WriteLine("B VirtualFun()"); public override void VirtualFun() Console.WriteLine("B VirtualFun()"); public class C : B public override void VirtualFun() Console.WriteLine("C VirtualFun()"); public class D : C public void NormalFun() Console.WriteLine("D NormalFun()"); public override void VirtualFun() Console.WriteLine("D VirtualFun()"); public override void VirtualFun() Console.WriteLine("D VirtualFun()"); public abstract class E : D public virtual void VirtualFun() Console.WriteLine("E VirtualFun()"); public abstract void VirtualFun(); public class F : E public override void VirtualFun() Console.WriteLine("F VirtualFun()"); public override void VirtualFun() Console.WriteLine("F VirtualFun()"); class Program static void Main(string[] args) // tutaj beda wywolania funkcji Console.ReadKey(); Powyższy przykład ukazuje sedno problemu. Każdy znajdzie w nim coś dla siebie. Jest to Karol Trybulec p-programowanie.pl 1
17 połączenie metod wirtualnych, metod abstrakcyjnych i zwykłych. Przeanalizujmy krok po kroku kilka wywołań, aby nie powielać kodu przyjmijmy, że znajdują się one w linijce. Spróbuj przewidzieć, co zostanie wypisane na ekran po wykonaniu tego kodu: Przykład: 1 A x = new B(); x.virtualfun(); Analiza: wczesne wiązanie: klasa A (od niej zaczniemy), późne wiązanie: klasa B (na niej skończymy) (w klasie A) typowana do wykonania jest funkcja A::VirtualFun. Jest wirtualna więc sprawdzamy czy nie jest wyżej przesłonięta? (w klasie B) typowana do wykonania jest funkcja przesłonięta B::VirtualFun. Jest wirtualna więc przerywamy łańcuch dziedziczenia (nie nadpisuje). wywołujemy A::VirtualFun (w klasie A) funkcja A::VirtualFun wywołuje funkcje VirtualFun (w klasie A) typowana do wykonania jest funkcja A::VirtualFun. Jest wirtualna więc sprawdzamy czy nie jest wyżej przesłonięta? (w klasie B) typowana do wykonania jest funkcja przesłonięta B::VirtualFun. To ostatnia klasa więc nie sprawdzamy wyżej. wywołujemy B::VirtualFun Wynik działania programu: 1 A VirtualFun() B VirtualFun() Przykład: 1 A x = new D(); x.virtualfun(); Analiza: wczesne wiązanie: klasa A (od niej zaczniemy), późne wiązanie: klasa D (na niej skończymy) (w klasie A) typowana do wykonania jest funkcja wirtualna A::VirtualFun. Jest wirtualna Karol Trybulec p-programowanie.pl 1
18 więc sprawdzamy czy nie jest wyżej przesłonięta? (w klasie B) typowana do wykonania jest funkcja przesłonięta B::VirtualFun. Jest wirtualna więc przerywamy łańcuch dziedziczenia (nie nadpisuje). wywołujemy A::VirtualFun (w klasie A) funkcja A::VirtualFun wywołuje funkcje VirtualFun (w klasie A) typowana do wykonania jest funkcja A::VirtualFun. Jest wirtualna więc sprawdzamy czy nie jest wyżej przesłonięta? (w klasie B) typowana do wykonania jest funkcja przesłonięta B::VirtualFun. Przesłania poprzednią funkcję, sprawdzamy czy nie jest wyżej przesłonięta? (w klasie C) brak funkcji VirtualFun więc dziedziczymy ją z klasy bazowej B::VirtualFun. (w klasie C) typowana do wykonania jest funkcja przesłonięta B::VirtualFun. Przesłania poprzednią funkcję, sprawdzamy czy nie jest wyżej przesłonięta? (w klasie D) typowana do wykonania jest funkcja przesłonięta D::VirtualFun. To ostatnia klasa więc nie sprawdzamy wyżej. wywołujemy D::VirtualFun Wynik działania programu: 1 A VirtualFun() D VirtualFun() Przykład: 1 C x = new F(); x.virtualfun(); x.normalfun(); Analiza: wczesne wiązanie: klasa C (od niej zaczniemy), późne wiązanie: klasa F (na niej skończymy) (w klasie C) typowana do wykonania jest funkcja C::VirtualFun. Jest przesłonięta więc sprawdzamy czy nie jest wyżej przesłonięta? (w klasie D) typowana do wykonania jest funkcja przesłonięta D::VirtualFun. Jest przesłonięta więc sprawdzamy czy nie jest wyżej przesłonięta? (w klasie E) typowana do wykonania jest funkcja przesłonięta E::VirtualFun. Jest wirtualna więc przerywamy łańcuch dziedziczenia (nie nadpisuje). wywołujmy D::VirtualFun (w klasie C) typowana do wykonania jest funkcja NormalFun. Bbrak funkcji NormalFun więc dziedziczymy ją z klasy bazowej B::NormalFun. wywołujemy B::NormalFun. Karol Trybulec p-programowanie.pl 1
19 Wynik działania: 1 D VirtualFun() B NormalFun() Przykład: 1 D x = new F(); x.virtualfun(); x.normalfun(); Analiza: wczesne wiązanie: klasa D (od niej zaczniemy), późne wiązanie: klasa F (na niej skończymy) (w klasie D) typowana do wykonania jest funkcja D::VirtualFun. Jest przesłonięta więc sprawdzamy czy nie jest wyżej przesłonięta? (w klasie E) typowana do wykonania jest funkcja E::VirtualFun. Jest wirtualna więc przerywamy łańcuch dziedziczenia (nie nadpisuje). wywołujmy D::VirtualFun (w klasie D) typowana do wykonania jest funkcja D::NormalFun. Jest odnaleziona więc wywołujemy: wywołujmy D::NormalFun Wynik działania: 1 D VirtualFun() D NormalFun() Podsumowanie i kilka ważnych zasad Jak widzisz, dziedziczenie wielu klas z metodami wirtualnymi może doprowadzić do lekkich problemów. Zalecam Ci poćwiczyć takie przykłady, ponieważ zawsze pojawiają się na testach kwalifikacyjnych. Prawdopodobnie nie aż w takim natężeniu, ale zawsze są zadania gdzie dziedziczenie odbywa się dla ilości klas n>. Oto podstawowe zasady na jakie należy zwracać uwagę w tak rozbudowanych przykładach: Analizujemy łańcuch klas zaczynając od typu statycznego kończąc na typie dynamicznym. Wywołanie metod normalnych (niepolimorficznych) zależy od typu statycznego, jeżeli takiej metody nie ma, są dziedziczone z klas bazowych (wędrujemy w dół po Karol Trybulec p-programowanie.pl 1
20 hierarchii dziedziczenia). Wywołanie metod polimorficznych (abstract i virtual) zależy od typu dynamicznego Jeżeli zaczynamy analizę od metody abstrakcyjnej lub wirtualnej, wędrujemy w górę po metodach przesłoniętych aż do typu statycznego obiektu (ostatnia klasa) lub aż do napotkania kolejnej metody wirtualnej lub abstrakcyjnej. Jeżeli zaczniemy analizę od metody przesłaniającej i napotkamy metodę abstrakcyjną lub wirtualną, kończymy analizę bez dochodzenia do typu statycznego. Zostaje przerwany łańcuch dziedziczenia z powodu wygenerowania nowej tabeli vtable. Niestety, te przykłady da się jeszcze bardziej utrudnić, np. wprowadzając metody wirtualne i abstrakcyjne do dwóch dziedziczących po sobie klas abstrakcyjnych. Polecam Ci zainteresować się takim przypadkiem. Nie umieszczam go w tym artykule, ponieważ analiza byłaby zbyt długa i nieczytelna. Podsumowanie Warto przyswoić sobie działanie polimorfizmu, napisać kilka prostych programów korzystających z tego mechanizmu. Obiektowość bez używania polimorfizmu nie istnieje, a przynajmniej nie wykorzystuje swoich wszystkich atutów. Polimorfizm oprócz tego, że niezbędny w rozbudowanych projektach, często znajduje swoje zastosowanie w implementacji wielu wzorców projektowych. Karol Trybulec p-programowanie.pl 0
Czym jest polimorfizm?
Metody wirtualne oraz metody abstrakcyjne są ściśle związane z mechanizmem polimorfizmu. Polimorfizm jest jednym z filarów paradygmatu programowania obiektowego. Jak wiadomo język C# jest w całości językiem
Bardziej szczegółowoPodczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.
Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.
Bardziej szczegółowoInformacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Bardziej szczegółowoObiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Bardziej szczegółowoProgramowanie obiektowe i zdarzeniowe
Marek Tabędzki Programowanie obiektowe i zdarzeniowe 1/23 Programowanie obiektowe i zdarzeniowe wykład 6 polimorfizm Na poprzednim wykładzie: dziedziczenie jest sposobem na utworzenie nowej klasy na podstawie
Bardziej szczegółowoKurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016
Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac
Bardziej szczegółowoKlasy abstrakcyjne i interfejsy
Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie
Bardziej szczegółowoDiagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.
Umiejętność czytania oraz tworzenia diagramów klas UML jest podstawą w przypadku zawodu programisty. Z takimi diagramami będziesz spotykał się w przeciągu całej swojej kariery. Diagramy klas UML są zawsze
Bardziej szczegółowoCzym są właściwości. Poprawne projektowanie klas
Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane
Bardziej szczegółowoDziedziczenie. Tomasz Borzyszkowski
Dziedziczenie Tomasz Borzyszkowski Podstawy Zobacz: Dziedzictwo1.java Dziedzictwo2.java Dziedziczenie jest jedną z podstawowych cech OOP ponieważ umożliwia łatwe implementowanie klasyfikacji hierarchicznych.
Bardziej szczegółowo.NET Klasy, obiekty. ciąg dalszy
.NET Klasy, obiekty ciąg dalszy Przeciążanie operatorów 1 W języku C# istnieje możliwość zdefiniowania funkcjonalności dużej części operatorów dla typów stworzonych przez użytkownika. Dzięki takiemu zabiegowi,
Bardziej szczegółowoProjektowanie obiektowe. Roman Simiński Polimorfizm
Projektowanie obiektowe Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Polimorfizm Koncepcja polimorfizmu Słowo polimorfizm pochodzi od dwóch greckich słów: poly czyli wiele, morphos czyli
Bardziej szczegółowoProgramowanie obiektowe w języku
Programowanie obiektowe w języku C++ Stanisław Gepner sgepner@meil.pw.edu.pl Dziedziczenie Wstęp Zacznijmy od przykładu Przykład rolniczy Każde zwierzątko wydaje dźwięk Każde się tak samo porusza Musimy
Bardziej szczegółowoWykład 9: Polimorfizm i klasy wirtualne
Programowanie obiektowe Wykład 9: i klasy wirtualne 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD Programowanie obiektowe i metody wirtualne 2 W programowaniu obiektowym polimorfizm
Bardziej szczegółowoKurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Bardziej szczegółowoProgramowanie obiektowe
Programowanie obiektowe Laboratorium 10 - klasy abstrakcyjne i interfejsy mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 17 maja 2017 1 / 13 mgr inż. Krzysztof Szwarc Programowanie obiektowe
Bardziej szczegółowoProgramowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Bardziej szczegółowoPolimorfizm. dr Jarosław Skaruz
Polimorfizm dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com O czym będzie? finalne składowe klasy abstrakcyjne interfejsy polimorfizm Finalne składowe Domyślnie wszystkie pola i metody
Bardziej szczegółowo1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
Bardziej szczegółowoProgramowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
Bardziej szczegółowoDariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego
Bardziej szczegółowo10. Programowanie obiektowe w PHP5
Ogólnie definicja klasy wygląda jak w C++. Oczywiście elementy składowe klasy są zmiennymi PHP, stąd nieśmiertelne $. Warto zauważyć, że mogą one mieć wartość HHH mgr inż. Grzegorz Kraszewski TECHNOLOGIE
Bardziej szczegółowoDziedziczenie. dr Jarosław Skaruz
Dziedziczenie dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com Dziedziczenie specjalizacja Dziedziczenie generalizacja Generalizacja-specjalizacja jest takim związkiem pomiędzy klasami,
Bardziej szczegółowoInterfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej
Programowanie obiektowe Interfejsy Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Interfejsy Autor: Paweł Rogaliński Instytut Informatyki,
Bardziej szczegółowoCzym jest stos i sterta?
W języku C# istnieje kilka podstawowych typów danych. Na pierwszy rzut oka nie widać między nimi żadnej różnicy, jednak pojawia się w charakterystycznych sytuacjach takich jak przekazywanie parametrów
Bardziej szczegółowoProgramowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,
Bardziej szczegółowoProgramowanie obiektowe
Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.
Bardziej szczegółowoZaawansowane programowanie w języku C++ Programowanie obiektowe
Zaawansowane programowanie w języku C++ Programowanie obiektowe Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
Bardziej szczegółowoPodstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Bardziej szczegółowoPolimorfizm, metody wirtualne i klasy abstrakcyjne
Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,
Bardziej szczegółowoDokumentacja do API Javy.
Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu
Bardziej szczegółowoProgramowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.
Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r. Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to
Bardziej szczegółowoJęzyki i techniki programowania Ćwiczenia 3 Dziedziczenie
Języki i techniki programowania Ćwiczenia 3 Dziedziczenie Klasa abstrakcyjna Autor: Marcin Orchel Klasa abstrakcyjna to taka, że nie możemy tworzyć obiektów tej klasy, możemy jednak dziedziczyć po tej
Bardziej szczegółowoEnkapsulacja, dziedziczenie, polimorfizm
17 grudnia 2008 Spis treści I Enkapsulacja 1 Enkapsulacja 2 Spis treści II Enkapsulacja 3 Czym jest interfejs Jak definuje się interfejs? Rozszerzanie interfejsu Implementacja interfejsu Częściowa implementacja
Bardziej szczegółowoC++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM
POLIMORFIZM Podstawowe pytanie, które nieustannie ma towarzyszyć autorowi programowi: czy gdyby nagle okazało się, że jest więcej... (danych na wejściu, typów danych, czynności, które program ma wykonać,
Bardziej szczegółowoTEMAT : KLASY DZIEDZICZENIE
TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą
Bardziej szczegółowoRozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Bardziej szczegółowoWykład 6: Dziedziczenie
Wykład 6: Dziedziczenie Dziedziczenie Jeden z filarów obiektowości. Budowa jednej klasy na bazie drugiej, przez dodawanie/przesłanianie jej składowych: nad-klasa klasa bazowa pod-klasa klasa pochodna od
Bardziej szczegółowoDziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.
Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik
Bardziej szczegółowoPHP 5 język obiektowy
PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje
Bardziej szczegółowoJAVA W SUPER EXPRESOWEJ PIGUŁCE
JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie
Bardziej szczegółowoJava. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego
Bardziej szczegółowoC++ - [4-7] Polimorfizm
Slajd 1 z 14 C++ - [4-7] Polimorfizm Nysa 2004-2013. Autor: Wojciech Galiński. wersja dnia 20 maja 2013 r. Slajd 2 z 14 Polimorfizm i klasa polimorficzna POLIMORFIZM (cytat z Wikipedii) (wielopostaciowość)
Bardziej szczegółowoInterfejsy i klasy wewnętrzne
Interfejsy i klasy wewnętrzne mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Interfejs klasy sposób komunikacji z jej obiektami (zestaw składowych publicznych). Określa on zestaw
Bardziej szczegółowoProjektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne
Projektowanie obiektowe Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Wzorce projektowe Wybrane wzorce strukturalne Fasada Facade Pattern 2 Wzorzec Fasada Facade Pattern koncepcja 3 Wzorzec
Bardziej szczegółowoTechnologie i usługi internetowe cz. 2
Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,
Bardziej szczegółowoC++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.
C++ - DZIEDZICZENIE Do najważniejszych cech języka C++ należy możliwość wielokrotnego wykorzystywania kodu Prymitywnym, ale skutecznym sposobem jest kompozycja: deklarowanie obiektów wewnątrz innych klas,
Bardziej szczegółowoWykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Bardziej szczegółowoKlasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego kodu bez edycji (i ewentualnego wprowadzania
Programowanie przyrostowe Rzutowanie w górę Zaleta dziedziczenia i kompozycji jest programowanie przyrostowe: Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego
Bardziej szczegółowoWskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:
Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie
Bardziej szczegółowoJęzyki i techniki programowania Ćwiczenia 4 Wzorce
Języki i techniki programowania Ćwiczenia 4 Wzorce Wzorce to metoda generacji różnych klas lub różnych funkcji. Autor: Marcin Orchel Przykład 1: Jeśli dana klasa C wykonuje obliczenia numeryczne, i wymaganiem
Bardziej szczegółowoProgramowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14
Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Wirtualne destruktory class A int* a; A(int _a) a = new int(_a);} virtual ~A() delete a;} class B: public A double* b;
Bardziej szczegółowoProgramowanie 2. Język C++. Wykład 9.
9.1 Ukrywanie metod, metody nadpisane... 1 9.2 Metody wirtualne, wirtualny destruktor... 2 9.3 Metody czysto wirtualne... 6 9.4 Klasy abstrakcyjne... 7 9.5 Wielodziedziczenie... 9 9.1 Ukrywanie metod,
Bardziej szczegółowoWykład 5 Okna MDI i SDI, dziedziczenie
Wykład 5 Okna MDI i SDI, dziedziczenie Autor: Zofia Kruczkiewicz Zagadnienia 1. Aplikacja wielookienkowa. Zakładanie projektu typu CLR Windows Forms 1.1. Aplikacja typu MDI 1.2. Aplikacja typu SDI 2. Dziedziczenie
Bardziej szczegółowoZaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie
Bardziej szczegółowoProgramowanie obiektowe
Programowanie obiektowe Laboratorium 3 i 4 - przypomnienie wiadomości o OOP na przykładzie Javy mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 8 marca 2017 1 / 20 mgr inż. Krzysztof Szwarc
Bardziej szczegółowoWstęp do programowania obiektowego, wykład 7
Wstęp do programowania obiektowego, wykład 7 Klasy i funkcje abstrakcyjne Przeciążanie funkcji Definiowanie i interpretacja złożonych typów danych w C++ Wskaźniki do funkcji 1 KLASA ABSTRAKCYJNA 2 Klasa
Bardziej szczegółowoPARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
Bardziej szczegółowoZaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 3 - polimorfizm. dr inż. Robert Nowak - p. 1/14 Powtórzenie Powtórzenie: klasy autonomiczne: konstruktor, konstruktor kopiujacy, operator przypisania, destruktor
Bardziej szczegółowoWykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej
Wykład V - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Programowanie obiektowe Dziedziczenie (inheritance) - mechanizm
Bardziej szczegółowoInformatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki
Informatyka I Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2017 Dziedziczenie klas
Bardziej szczegółowoDariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki zaprojektowany jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych jest to język pozwalający na programowanie zarówno proceduralne
Bardziej szczegółowoKonstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.
Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class
Bardziej szczegółowoAplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium
Bardziej szczegółowoznajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Bardziej szczegółowoInformatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Bardziej szczegółowoListy powiązane zorientowane obiektowo
Listy powiązane zorientowane obiektowo Aby zilustrować potęgę polimorfizmu, przeanalizujmy zorientowaną obiektowo listę powiązaną. Jak zapewne wiesz, lista powiązana jest strukturą danych, zaprojektowaną
Bardziej szczegółowoKlasy abstrakcyjne, interfejsy i polimorfizm
Programowanie obiektowe 12 kwietnia 2011 Organizacyjne Klasówka będzie 20 IV 2011. Sale jeszcze są pertraktowane. Materiał do wyjątków włącznie. Można mieć swoje materiały nieelektroniczne. Wywołanie z
Bardziej szczegółowoJAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.
JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod
Bardziej szczegółowoWprowadzenie do programowanie obiektowego w języku C++
Wprowadzenie do programowanie obiektowego w języku C++ Część czwarta Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura
Bardziej szczegółowoPoczątki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8
Początki Javy Java została pierwotnie zaprojektowana dla telewizji interaktywnej, ale była to zbyt zaawansowaną technologią dla branży cyfrowej telewizji kablowej. James Gosling, Mike Sheridan i Patrick
Bardziej szczegółowoC++ Przeładowanie operatorów i wzorce w klasach
C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje
Bardziej szczegółowoFunkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.
Funkcje wirtualne W C++ polimorfizm jest zrealizowany w dwa sposoby: na etapie kompilacji i na etapie wykonania. Na etapie kompilacji polimorfizm jest zrealizowany poprzez przeciążenie funkcji i operatorów.
Bardziej szczegółowoWykład 5: Klasy cz. 3
Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu
Bardziej szczegółowoWSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy
WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy Pojęcie klasy Program napisany w języku Java składa się ze zbioru klas. Każda klasa zawiera
Bardziej szczegółowoSzablony funkcji i klas (templates)
Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp
Bardziej szczegółowoPodstawy Programowania semestr drugi. Wykład czternasty
Wykład czternasty 1. Polimorfizm Ostatni wykład zakończyliśmy stwierdzeniem, że możemy obiektowi dowolnej klasy przypisa ć obiekt klasy dziedziczącej po tej klasie. Przypisanie takie obejmuje jednak jedynie
Bardziej szczegółowoPodstawy programowania obiektowego
1/23 Podstawy programowania obiektowego wykład 8 polimorfizm, wyjątki, kolekcje generyczne Na poprzednim wykładzie: dziedziczenie jest sposobem na utworzenie nowej klasy na podstawie klasy już istniejącej,
Bardziej szczegółowoJęzyk JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy Wykład 4, część 1 1 Język JAVA podstawy Plan wykładu: 1. Podstawy modelowania obiektowego 2. Konstruktory 3. Dziedziczenie, związki pomiędzy klasami, UML 4. Polimorfizm 5. Klasy abstrakcyjne
Bardziej szczegółowoSzablony funkcji i szablony klas
Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument
Bardziej szczegółowo1 Atrybuty i metody klasowe
1 Atrybuty i metody klasowe Składowe klasowe (statyczne) Każdy obiekt klasy posiada własny zestaw atrybutów. Metody używają atrybutów odpowiedniego obiektu. Czasem potrzeba atrybutów wspólnych dla wszystkich
Bardziej szczegółowoC++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.
C++ - DZIEDZICZENIE Do najważniejszych cech języka C++ należy możliwość wielokrotnego wykorzystywania kodu Prymitywnym, ale skutecznym sposobem jest kompozycja: deklarowanie pól obiektowych wewnątrz innych
Bardziej szczegółowoJava - tablice, konstruktory, dziedziczenie i hermetyzacja
Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja
Bardziej szczegółowoWyjątki (exceptions)
Instrukcja laboratoryjna nr 6 Programowanie w języku C 2 (C++ poziom zaawansowany) Wyjątki (exceptions) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp Wyjątki (ang.
Bardziej szczegółowoDefiniowanie własnych klas
Programowanie obiektowe Definiowanie własnych klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Definiowanie własnych klas Autor:
Bardziej szczegółowoJęzyk JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy Wykład 3, część 3 1 Język JAVA podstawy Plan wykładu: 1. Konstrukcja kodu programów w Javie 2. Identyfikatory, zmienne 3. Typy danych 4. Operatory, instrukcje sterujące instrukcja warunkowe,
Bardziej szczegółowoProgramowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 03 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas abstrakcyjnych i interfejsów. Wprowadzenie
Bardziej szczegółowoDeklaracja struktury w C++
Struktury to złożone typy danych pozwalające przechowywać różne informacje. Za pomocą struktur możliwe jest grupowanie wielu zmiennych o różnych typach w jeden obiekt. Strukturę można nazywać obiektem
Bardziej szczegółowoJava Język programowania
Java Język programowania Język Java Bazuje i jest zbliżony do C/C++ Porosty zbiór typów danych (podział na typy prymitywne i obiektowe) Zarządzanie pamięcią i Garbage Collection Zintegrowana synchronizacja
Bardziej szczegółowoDziedziczenie. Ogólna postać dziedziczenia klas:
Dziedziczenie Ogólna postać dziedziczenia klas: class nazwa_clasy_pochodnej : specyfikator_dostępu nazwa_clasy_bazowej specyfikator_dostępu : public private protected Specyfikator dostępu definiuje, w
Bardziej szczegółowoRysunkowy tutorial Możesz swobodnie dystrybuować ten plik jeśli pozostawisz go w nietkniętym stanie. Możesz także cytować jego fragmenty umieszczając w tekście odnośnik http://mbartyzel.blogspot.com Jak
Bardziej szczegółowoWprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).
Wprowadzenie w dziedziczenie Klasa D dziedziczy klasę B: B klasa bazowa D klasa pochodna Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Najpierw jest tworzona klasa bazowa,
Bardziej szczegółowoProgramowanie obiektowe, wykład nr 6. Klasy i obiekty
Dr hab. inż. Lucyna Leniowska, prof. UR, Zakład Mechatroniki, Automatyki i Optoelektroniki, IT Programowanie obiektowe, wykład nr 6 Klasy i obiekty W programowaniu strukturalnym rozwój oprogramowania oparto
Bardziej szczegółowoZwiązek między pojęciami Zasada podstawialności Podklasy muszą realizować kontrakt zawarty przez nadklasy
Janusz Jabłonowski Związek między pojęciami Zasada podstawialności Podklasy muszą realizować kontrakt zawarty przez nadklasy Przedefiniowywanie lub podmienianie (ang. overriding, czasami błędnie tłumaczone
Bardziej szczegółowoProgramowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h
Programowanie II Lista 3 Modyfikatory dostępu plik TKLientBanku.h plik z funkcją main Przyjaźń Dziedziczenie Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące. Jest to
Bardziej szczegółowoKlasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np
Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami
Bardziej szczegółowoProgramowanie w Internecie. Java
Programowanie w Internecie Java Autor: dr inż. Zofia Kruczkiewicz Literatura: L. Lemay, R. Cadenhead P. Naughton Krzysztof Barteczko Boone Barry Java 2 dla każdego Podręcznik Języka Programowania Java
Bardziej szczegółowoPodstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Bardziej szczegółowoKurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/
Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i
Bardziej szczegółowo