Polimorfizm, metody wirtualne i klasy abstrakcyjne



Podobne dokumenty
Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Kompozycja i dziedziczenie klas

Kompozycja i dziedziczenie klas

Definiowanie własnych klas

Programowanie w Javie wykład 7 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Bloki inicjalizacyjne

Dokumentacja do API Javy.

Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe i zdarzeniowe

Enkapsulacja, dziedziczenie, polimorfizm

PARADYGMATY PROGRAMOWANIA Wykład 4

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Wykład 4: Klasy i Metody

Programowanie w Javie - wykład 3

Wykład 6: Dziedziczenie

Dziedziczenie. dr Jarosław Skaruz

Aplikacje w Javie wykład 5 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Interfejsy

Programowanie w Internecie. Java

Wykład 7: Pakiety i Interfejsy

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Kurs WWW. Paweł Rajba.

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Dziedziczenie. Tomasz Borzyszkowski

JAVA- wykład 2 Klasy

Materiały do zajęć VII

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Rozdział 4 KLASY, OBIEKTY, METODY

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Klasy abstrakcyjne, interfejsy i polimorfizm

Definiowanie własnych klas

Programowanie obiektowe

Programowanie obiektowe

Język Java część 2 (przykładowa aplikacja)

Projektowanie obiektowe. Roman Simiński Polimorfizm

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Java: interfejsy i klasy wewnętrzne

PHP 5 język obiektowy

Dziedziczenie i interfejsy

Java Język programowania

Programowanie obiektowe

Programowanie obiektowe

Języki i metody programowania Java. Wykład 2 (część 2)

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Programowanie w Javie wykład 8 Interfejsy

TEMAT : KLASY DZIEDZICZENIE

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie obiektowe

Dziedziczenie jednobazowe, poliformizm

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Platformy Programistyczne Podstawy języka Java

Wykład 9: Polimorfizm i klasy wirtualne

Programowanie w środowisku graficznym- wykład 2 Java - Klasy

Przykład -

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Interfejsy i klasy wewnętrzne

Programowanie 2. Język C++. Wykład 3.

Programowanie obiektowe w języku

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

1 Atrybuty i metody klasowe

Język Java część 2 (przykładowa aplikacja)

DOSTĘP DO METOD I ZMIENNYCH. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla każdego, Helion 2001)

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

DOSTĘP DO METOD I ZMIENNYCH, TABLICE. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla kaŝdego, Helion 2001)

Podstawy Języka Java

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Aplikacje w środowisku Java

Związek między pojęciami Zasada podstawialności Podklasy muszą realizować kontrakt zawarty przez nadklasy

Przypomnienie o klasach i obiektach

Zaawansowane programowanie w języku C++ Programowanie obiektowe

J zyk Java cz 1 (streszczenie)

KLASY, INTERFEJSY, ITP

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Klasy abstrakcyjne i interfejsy

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład 5: Więcej o Klasach i Metodach

Języki i metody programowania Java Lab2 podejście obiektowe

Technologie i usługi internetowe cz. 2

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe

Java SE Laboratorium nr 2. Temat: Obiektowość

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Wykład 5 Okna MDI i SDI, dziedziczenie

Definicje klas i obiektów. Tomasz Borzyszkowski

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Dziedziczenie jednobazowe, poliformizm, tablice wskaźników na obiekty

Programowanie obiektowe

Aplikacje w środowisku Java

Języki i metody programowania Java INF302W. Wykład 1 (część 1) na podstawie Autor Dr inż. Zofia Kruczkiewicz

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Podstawa: Bruce Eckel, Thinking in Java, Second Ed., Prentice Hall, 1998 The JavaLanguage Environment, A white Paper, Sun, Oct.

Transkrypt:

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, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 1 / 22

Dziedziczenie Dziedziczenie polega na przejęciu właściwości i funkcjonalności obiektów innej klasy i ewentualnej modyfikacji tych właściwości i funkcjonalności w taki sposób, by były one bardziej wyspecjalizowane. Do wyrażania relacji dziedziczenia jednej klasy przez drugą służy słowo kluczowe extends class B extends A... Klasa B dziedziczy (rozszerza) klasę A, tzn. klasa A jest klasą bazową, (superklasą) klasy B klasa B jest klasą pochodną klasy A Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 2 / 22

Przykład: Dziedziczenie cd. Klasa Publikacja zawiera: pole tytul z klasy String i pole cena typu double. Klasa Ksiązka dziedziczy po klasie Publikacja i dodatkowo zawiera: pole autor należące do klasy String. Klasa Czasopismo dziedziczy po klasie Publikacja i dodatkowo zawiera: pole numer typu int. Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 3 / 22

Dziedziczenie cd. Definicja klasy bazowej Publikacja class Publikacja private String tytul; private double cena; Publikacja(String tytul, double cena) this.tytul = tytul; this.cena = cena; public String podajtytul() return tytul; public double podajcene() return cena; Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 4 / 22

Dziedziczenie cd. Definicja klas pochodnych Ksiazka i Czasopismo, które dziedziczą po klasie Publikacja class Ksiazka extends Publikacja private String autor; Ksiazka(String autor, String tytul, double cena) super(tytul, cena); // Wywołanie konstruktora klasy bazowej Publikacja this.autor = autor; public String podajautor() return autor; class Czasopismo extends Publikacja private int numer; Czasopismo(String tytul, int numer, double cena) super(tytul, cena); // Wywołanie konstruktora klasy bazowej Publikacja this.numer = numer; public int podajnumer() return numer; Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 5 / 22

Dziedziczenie cd. Przykładowe instrukcje tworzące nowe obiekty klas Ksiazka i Czasopismo: Ksiazka lektura = new Ksiazka( Bolesław Prus, Lalka, 22.50 ); Czasopismo gazeta = new Czasopismo( Przektój, 12, 3.90 ); lektura gazeta Ksiazka tytul cena 22.50 autor Publikacja(...) podajtytul() podajcena() Ksiazka(...) podajautor() String Lalka Czasopismo tytul cena 3.90 numer 12 Publikacja(...) podajtytul() podajcena() Czasopismo(...) podajnumer() String Bolesław Prus String Przekrój Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 6 / 22

Konwersje referencyjne Można zauważyć, że obiekt klasy pochodnej posiada wszystkie atrybuty i metody klasy bazowej, a więc zawiera w sobie obiekt klasy bazowej (nadklasy). Dlatego odniesienie do takiego obiektu można zapamiętać w zmiennej referencyjnej klasy bazowej. Obiekty klasy Ksiazka i klasy Czasopismo mają właściwości obiektów klasy Publikacja (tzn. posiadają wszystkie atrybuty i metody klasy Publikacja). Referencje do obiektów klas Ksiazka i Czasopismo można więc przypisywać do zmiennych referencyjnych klasy Publikacja. Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 7 / 22

Konwersje referencyjne cd. Przykładowe instrukcje tworzące nowe obiekty klas Ksiazka i Czasopismo: Publikacja publ_1 = new Ksiazka( Bolesław Prus, Lalka, 22.50 ); Publikacja publ_2 = new Czasopismo( Przektój, 12, 3.90 ); publ_1 publ_2 Ksiazka tytul cena 22.50 autor Publikacja(...) podajtytul() podajcena() Ksiazka(...) podajautor() String Lalka Czasopismo tytul cena 3.90 numer 12 Publikacja(...) podajtytul() podajcena() Czasopismo(...) podajnumer() String Bolesław Prus String Przekrój Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 8 / 22

Referencyjna konwersja rozszerzająca Referencyjna konwersja rozszerzająca to przekształcenie referencji do obiektu klasy pochodnej na referencję do typu wyższego czyli nadklasy (klasy bazowej). Referencyjna konwersja rozszerzająca jest dokonywana automatycznie przy: przypisywaniu zmiennej referencyjnej odniesienia do obiektu klasy pochodnej, przekazywaniu argumentów metodzie, gdy parametr metody jest typu referencja do obiektu nadklasy przekazywanego argumentu zwracaniu wyniku metody, gdy wynik podstawiamy na zmienną będącą referencją do obiektu nadklasy zwracanego wyniku. Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 9 / 22

Referencyjna konwersja rozszerzająca class Wydawnictwo static Publikacja utworzpublikacje(int rodzaj) switch(rodzaj) case 1: // utworz ksiazke return new Ksiazka("Barteczko", "Java", 45.00); case 2: // utworz czasopismo return new Czasopismo("PC Format", 11, 9.50); return null; static double roznicaceny(publikacja p1, Publikacja p2 ) return p1.podajcene() - p2.podajcene(); public static void main(string [] args) Publikacja p1 = utworzpublikacje(1); Publikacja p2 = utworzpublikacje(2); roznicaceny(p1, p2); Konwersja referencyjna przy zwracaniu wyniku Konwersja referencyjna przy przekazywaniu argumentow Ksiazka k = new Ksiazka("Barteczko", "Java", 45.00); Czasopismo c = new Czasopismo("PC Format", 11, 9.50); roznicaceny(k, c); p1 = k; p2 = c; roznicaceny(p1, p2); Konwersja referencyjna przy przypisywaniu Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 10 / 22

Referencyjna konwersja zawężająca Referencyjna konwersja zawężająca to przekształcenie referencji klasy bazowej na referencję do typu niższego czyli podklasy (klasy pochodnej). Taka konwersja jest dozwolona tylko wtedy, gdy referencja klasy bazowej wskazuje na obiekt, który w rzeczywistości należy do klasy pochodnej. Referencyjna konwersja zawężająca (konwersja w dół ) : zawsze wymaga jawnego użycia operatora konwersji, jest bezpieczna. Java w trakcie wykonywania programu sprawdza czy obiekt, na który wskazuje referencja, jest faktycznie obiektem należącym do klasy pochodnej. Gdy tak nie jest to zostanie zgłoszony wyjątek ClassCastException. Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 11 / 22

Referencyjna konwersja zawężająca class Wydawnictwo static Publikacja utworzpublikacje(int rodzaj) switch(rodzaj) case 1: // utworz ksiazke return new Ksiazka("Barteczko", "Java", 45.00); case 2: // utworz czasopismo return new Czasopismo("PC Format", 11, 9.50); return null; public static void main(string [] args) Publikacja publ_1, publ_2; String autor_1, autor_2; Ksiazka ksiaz; Zawężająca konwersja referencyjna publ_1 = utworzpublikacje(1); // utworzenie obiektu klasy Ksiazka publ_2 = utworzpublikacje(2); // utworzenie obiektu klasy Publikacja ksiaz = (Ksiazka)publ_1; autor_1 = ksiaz.podajautor(); ksiaz = (Ksiazka)publ_2; autor_2 = ksiaz.podajautor(); Tu zostanie zgłoszony wyjątek ClassCastException autor_1 = ((Ksiazka)publ_1).podajAutor(); autor_2 = ((Ksiazka)publ_2).podajAutor(); Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 12 / 22

Operator instanceof Operator instanceof jest wykorzystywany do stwierdzenia, do jakiej klasy należy obiekt. Wyrażenie: nazwazmiennej instanceof nazwaklasy ma wartość true, jeśli zmienna nazwazmiennej wskazuje na obiekt należący do klasy nazwaklasy, albo dowolnej jej podklasy. Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 13 / 22

Operator instanceof public static void main(string [] args) Publikacja publ_1, publ_2; String autor_1, autor_2; Ksiazka ksiaz; publ_1 = utworzpublikacje(1); // utworzenie obiektu klasy Ksiazka publ_2 = utworzpublikacje(2); // utworzenie obiektu klasy Publikacja if (publ_1 instanceof Ksiazka) ksiaz = (Ksiazka)publ_1; autor_1 = ksiaz.podajautor(); if (publ_2 instanceof Ksiazka) ksiaz = (Ksiazka)publ_2; autor_2 = ksiaz.podajautor(); if (publ_1 instanceof Ksiazka) autor_1 = ((Ksiazka)publ_1).podajAutor(); Użycie operatora instanceof zabezpiecza przed próbą wykonania niedozwolonej konwersji zawężającej if (publ_2 instanceof Ksiazka) autor_2 = ((Ksiazka)publ_2).podajAutor(); Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 14 / 22

Metody wirtualne Jeśli w podklasie (klasie pochodnej) zostanie przedefiniowana jakaś metoda, zdefiniowana pierwotnie w nadklasie (klasie bazowej) to przy wywołaniu tej metody zostanie uruchomiona metoda tej klasy, do której faktycznie należy obiekt, a nie tej klasy która jest typem zmiennej referencyjnej zawierającej odniesienie do obiektu. Oznacza to, że wiązanie odwołań do metod z kodem programu następuje nie w czasie kompilacji programu, lecz fazie wykonania programu tuż przed każdorazowym wykonaniem instrukcji wywołującej przedefiniowaną metodę. Metody wirtualne to takie metody, dla których wiązanie odwołań z kodem programu następuje w fazie wykonania programu Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 15 / 22

Metody wirtualne cd. Metody wirtualne to takie metody, dla których wiązanie odwołań z kodem programu następuje w fazie wykonania programu W Javie wszystkie metody są wirtualne za wyjątkiem: metod statycznych (bo nie dotyczą obiektów, a klasy) metod deklarowanych ze specyfikatorem final, który oznacza, że metoda jest ostateczne i nie może być przedefiniowana, metod prywatnych (bo metody prywatne nie mogą zostać przedefiniowane). Odwołania do metod wirtualnych są polimorficzne, gdyż efekt każdorazowego odwołania może przybierać różne kształty, w zależności od tego jaki jest faktyczny typ obiektu, na rzecz którego wywołano metodę wirtualną. Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 16 / 22

Metody wirtualne - przykład. class Zwierz String nazwa = "nieznany"; Zwierz() Zwierz(String n) nazwa = n; String podajgatunek() return "Jakis zwierz"; String podajnazwe() return nazwa; String podajglos() return "?"; void mowa() System.out.println(podajGatunek() + " " + podajnazwe() + " mowi " + podajglos() ); Metody podajgatunek(), podajnazwe(), podajglos() są wirtualne. class Pies extends Zwierz Pies() Pies(String n) super(n); String podajgatunek() return "Pies"; String podajglos() return "HAU HAU!"; Działanie metod wirtualnych wywołanych w metodzie mowa() będzie zależeć od klasy obiektu, na rzecz którego zostanie wywołana metoda mowa(). class Kot extends Zwierz Kot() Kot(String n) super(n); String podajgatunek() return "Kot"; String podajglos() return "Miauuu..."; Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 17 / 22

Metody wirtualne przykład cd. class ZOO static void dialogzwierzat(zwierz z1, Zwierz z2) z1.mowa(); z2.mowa(); System.out.println("----------------------------"); public static void main(string []args) Zwierz z1 = new Zwierz(), z2 = new Zwierz("Inny zwierz"); Pies pies = new Pies(), szarik = new Pies("Szarik"), reksio = new Pies("Reksio"); Kot filemon = new Kot("Filemon"); dialogzwierzat(z1, z2); dialogzwierzat(szarik, reksio); dialogzwierzat(pies, filemon); dialogzwierzat(szarik, filemon); Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 18 / 22

Metody i klasy abstrakcyjne Metoda abstrakcyjna to metoda, która nie ma implementacji (ciała) i jest zadeklarowana ze specyfikatorem abstract. Taka metoda może być deklarowana tylko w klasie abstrakcyjnej! abstract int obliczcos(); nie ma ciała tylko średnik Klasą abstrakcyjną to klasa, opatrzona specyfikatorem abstract. Taka klasa może (ale nie musi) zawierać metody abstrakcyjne. abstract class JakasKlasa metoda abstrakcyjna abstract int obliczcos(); void wypiszcos() System.out.printn( cos ); Nie można tworzyć obiektów klasy abstrakcyjnej!!! Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 19 / 22

Metody i klasy abstrakcyjne cd. Klasa abstrakcyjna może być dziedziczona przez nowe klasy. Klasa pochodna MUSI przedefiniować (a właściwie zdefiniować) wszystkie metody abstrakcyjne, które odziedziczyła z abstrakcyjnej klasy bazowej. W przeciwnym wypadku klasa pochodna nadal pozostanie klasą abstrakcyjną i nie będzie można tworzyć jej obiektów. Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 20 / 22

Metody i klasy abstrakcyjne - przykład. abstract class Zwierz String nazwa = "nieznany"; Zwierz() Zwierz(String n) nazwa = n; String podajnazwe() return nazwa; abstract String podajgatunek(); abstract String podajglos(); void mowa() System.out.println(podajGatunek() + " " + podajnazwe() + " mowi " + podajglos() ); class Pies extends Zwierz Pies() Pies(String n) super(n); String podajgatunek() return "Pies"; String podajglos() return "HAU HAU!"; class Kot extends Zwierz Kot() Kot(String n) super(n); String podajgatunek() return "Kot"; String podajglos() return "Miauuu..."; Metody podajgatunek(), podajglos() są abstrakcyjne. W metodzie mowa() są wywoływane metody abstrakcyjne, które nie zostały jeszcze zdefiniowane. Przedefiniowanie (Konkretyzacja) metod abstrakcyjnych odziedziczo- zadeklarowanych z abstrakcyjnej w abstrakcyjnej klasy bazowej klasie bazowej Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 21 / 22

Metody i klasy abstrakcyjne przykład cd. class ZOO static void dialogzwierzat(zwierz z1, Zwierz z2) z1.mowa(); z2.mowa(); System.out.println("----------------------------"); public static void main(string []args) // Zwierz z1 = new Zwierz(), // z2 = new Zwierz("Inny zwierz"); Zwierz z1 = new Pies(), z2 = new Kot( Bonifacy ); Nie wolno tworzyć obiektów klasy abstrakcyjnej Tu następują referencyjne konwersje rozszerzające. Pies pies = new Pies(), szarik = new Pies("Szarik"), reksio = new Pies("Reksio"); Kot filemon = new Kot("Filemon"); dialogzwierzat(z1, z2); dialogzwierzat(szarik, reksio); dialogzwierzat(pies, filemon); dialogzwierzat(szarik, filemon); Polimorfizm, metody wirtualne i klasy abstrakcyjne Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 22 / 22