Czym jest polimorfizm?
|
|
- Tadeusz Paluch
- 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
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: 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: 0 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ę. 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ą: 0 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. 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: 0 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: 0 0 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 /*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
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: 0 0 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
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: public void JakasMetoda(Pracownik p) p.jakasoperacja(); Bez użycia funkcji wirtualnych metoda musiałaby wyglądać następująco: 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? 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
14 0 0 0 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
15 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: 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: A VirtualFun() B VirtualFun() Przykład: 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
16 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: A VirtualFun() D VirtualFun() Przykład: 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
17 Wynik działania: D VirtualFun() B NormalFun() Przykład: 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: 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
18 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
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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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
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ół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ół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ół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ół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ół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ół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ół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ół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ół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 - 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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ół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ółowoTEMAT : KLASY POLIMORFIZM
TEMAT : KLASY POLIMORFIZM 1. Wprowadzenie do polimorfizmu i funkcji wirtualnych w języku C++ Język C++ zakłada, że w pewnych przypadkach uzasadnione jest tworzenie klas, których reprezentanci w programie
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ół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ół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ół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ół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ółowoProgramowanie 2. Język C++. Wykład 3.
3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane
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ółowoKurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016
Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,
Bardziej szczegółowoWykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Bardziej szczegółowoMarcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych
Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych mluckner@mini.pw.edu.pl http://www.mini.pw.edu.pl/~lucknerm Programy w Javie składają się z pakietów Pakiety zawierają definicje
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ół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ół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ółowoPrzykład -
Polimorfizm Przykład - http://rpodhajny.wordpress.com klasa bazowa A, oraz klasy pochodne B1, B2,, Bn (dziedziczące po klasie bazowej). niektóre klasy pochodne chcą mieć możliwość skorzystania z metody
Bardziej szczegółowoDziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
Bardziej szczegółowoSkładnia C++ Programowanie Obiektowe Mateusz Cicheński
Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Konstruktory i destruktory
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ółowoPodstawy programowania III
Podstawy programowania III Jan Kazimirski 1 Opis zajęć Zastosowanie funkcji i obiektów w PHP powtórzenie zagadnień. Dostęp do bazy danych PostgreSQL z poziomu skryptu PHP. Wprowadzenie do języka SQL. Przykłady
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ółowoWykład 7: Pakiety i Interfejsy
Wykład 7: Pakiety i Interfejsy Plik Źródłowy w Javie Składa się z: instrukcji pakietu (pojedyncza, opcjonalna) instrukcji importujących (wielokrotne, opcjonalne) deklaracji klasy publicznej (pojedyncza,
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ół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ółowoProgramowanie obiektowe
Programowanie obiektowe Wykład 2 Marcin Młotkowski 4 marca 2015 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 47 Krótki opis C Obiektowy, z kontrolą typów; automatyczne odśmiecanie;
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ół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ółowo