Języki i techniki programowania Ćwiczenia 4 Wzorce

Podobne dokumenty
Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Języki i techniki programowania Ćwiczenia 2

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe

Szablony. Szablony funkcji

Klasy abstrakcyjne i interfejsy

Polimorfizm, metody wirtualne i klasy abstrakcyjne

C++ Przeładowanie operatorów i wzorce w klasach

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

TEMAT : KLASY DZIEDZICZENIE

Klasy abstrakcyjne, interfejsy i polimorfizm

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Szablony klas, zastosowanie szablonów w programach

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

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Zaawansowane programowanie w C++ (PCP)

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

Programowanie obiektowe i zdarzeniowe

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Dokumentacja do API Javy.

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

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Programowanie obiektowe - 1.

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Szablony funkcji i klas (templates)

Aplikacje w środowisku Java

Dziedziczenie. dr Jarosław Skaruz

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Metody sparametryzowane

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Szablony funkcji i szablony klas

Podstawy Programowania Obiektowego

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

Programowanie strukturalne i obiektowe. Funkcje

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Enkapsulacja, dziedziczenie, polimorfizm

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

1 Atrybuty i metody klasowe

Zaawansowane programowanie w C++ (PCP)

C++ - [4-7] Polimorfizm

Wprowadzenie do szablonów szablony funkcji

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

Technologie i usługi internetowe cz. 2

Programowanie obiektowe

Wykład 9: Polimorfizm i klasy wirtualne

Podstawy i języki programowania

Wykład 6: Dziedziczenie

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

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

Wprowadzenie do szablonów szablony funkcji

Informatyka II Laboratorium 3 : Programowania obiektowe C++ - dziedziczenie

Typy sparametryzowane

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

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

Podstawy programowania obiektowego

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

PHP 5 język obiektowy

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

Java: interfejsy i klasy wewnętrzne

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Podstawy programowania w języku C++ Zadania - dziedziczenie i polimorfizm

Abstrakcyjny typ danych

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

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

Programowanie obiektowe

Wykład 5: Klasy cz. 3

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

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

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

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

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

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Programowanie, część I

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Programowanie obiektowe

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Wykład 9: Metody wirtualne i polimorfizm

Języki programowania imperatywnego

Mechanizm dziedziczenia

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie obiektowe. Wykład 5. C++: szablony

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Programowanie obiektowe

Transkrypt:

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 jest przeprowadzanie obliczeń zarówno dla typu float jak i double, np w celach porównawczych to można zastosować wzorce. Alternatywą byłoby napisanie klasy C dla typu float jak i double, wadą tej metody byłaby redundancja kodu. Drugą alternatywą byłoby przekazanie do wszystkich funkcji wykonujących obliczenia na typie float lub double abstrakcyjnej klasy bazowej D dla opakowanych typów float i double. Wady tego rozwiązania: w ogólności konieczność stworzenia klasy bazowej również dla typów, które nie są ze sobą powiązane. Konieczność opakowywania typów prostych. Wszystkie funkcje wykonujące obliczenia na typie D mogłyby być również przeniesione do wnętrza klasy D. Klasa wzorcowa template<class T> C Operowanie na klasach wygenerowanych z wzorca: C<float> o1; C<double> o2; Przykład 2: Jak zrealizować metodę porównującą dwa elementy dowolnego typu? 1. Przekazanie dwóch elementów typu Comparable. Wadą tego rozwiązania, jest to, że element, który może być porównywany musi dziedziczyć po Comparable. 2. Przekazanie dwóch argumentów typu Object o1 i o2, oraz przekazanie obiektu Comparatora dla dwóch podanych obiektów o1 i o2. 3. Zastosowanie wzorców template<t> int compare(t o1, T o2) return o1.compareto(o2); Przykład 3: Często wykorzystujemy listy elementów tego samego typu. Zapewnienie, że lista będzie miała ten sam typ dla każdego elementu, może wyglądać następująco:

po dodaniu pierwszego obiektu do listy zapamiętywany jest typ tego obiektu, przy dodawaniu następnych obiektów typ tych obiektów jest weryfikowany. Takie sprawdzenie typów odbywałoby się juz w czasie działania programu. Zapewnienie kontroli typów w czasie kompilacji za pomocą wzorców: template<t> List public : add(t element) ; Teraz juz w trakcie kompilacji sprawdzany jest typ dodawanych obiektów, wszędzie tam gdzie jest używana metoda add. W Javie można używać list bez genericów, wtedy takie listy dopuszczają różne elementy, lub można używać list z genericami od wersji 1.5. W C++ biblioteka standardowa zawierająca m.in. różne kolekcje, w tym liste, napisana jest z wykorzystaniem wzorców, a więc stosowanie wzorców jest w tym wypadku konieczne. W C++ błędy związane z użyciem wzorców sprawdzane są w miejscu użycia wzorca, mogą być również sprawdzane na etapie linkowania. Błąd, taki, że parametr wzorca T nie ma metody, która jest wywoływana w klasie C, zostanie wykryty na etapie kompilacji przy wywołaniu tej metody. Różnice między genericami w Javie, a wzorcami w C++. W Javie nie mozna podawac typow prostych. W Javie public static <T> void foo(t arg) nie można wywołać metody np arg.he() w metodzie foo, ponieważ typ T ma zdefiniowane metody tylko te co są w typie Object. W C++ można coś takiego zrobić, wtedy przy wywołaniu metody foo sprawdzane jest czy istnieje metoda he() na podanym argumencie. W Javie generici są tylko informacją dla kompilatora, w kodzie pośrednim nie występują w ogóle informacje o genericach, są one usuwane. W C++ przy definicji nowej klasy z wzorca klasa ta jest tworzona i kod klasy wzorcowej jest reprodukowany do nowo powstałej klasy. Pytanie Jeśli metoda przyjmuje List<Figure> czy mozna podać do tej metody List<Circle>? Nie można tego zrobić w Javie, ponieważ gdyby było to możliwe to mielibyśmy listę dowolnych figur i moglibyśmy dodać do niej dowolną figurę. Rozwiązaniem jest List<? extends Figure>, które mówi, że podawany jest jakiś typ dziedziczący po Figure. W tym wypadku też nie można wywołać funkcji add, ponieważ wiemy, że jest to jakiś typ dziedziczący po Figure, ale nie wiemy jaki to jest typ.

W C++ również występuje to zagadnienie, ale nie ma takiego rozwiązania jak w Javie. Ogólnym rozwiązaniem tego zagadnienia jest zastosowanie templatów. template<t> foo(list<t> list). Wtedy możemy podać listę dowolnych elementów.

Zadania Zadanie podstawowe a) Zrobić własną implementację listy jednokierunkowej przechowującej obiekty tego samego dowolnego typu, który posiada operator ==, oraz > wykorzystując do tego wzorce zaimplementować dla tej listy metodę addelement, removeelement, swapelements, getelement, compareelements, parametr wzorca opakować typem InternalListElement zawierającym referencję do następnego obiektu b) Zrobić implementację listy jednokierunkowej bez wzorców, która może przechowywać elementy typu abstrakcyjnego ListElement, zaimplementować te same metody co w podpunkcie a), typ ListElement powinien zostać opakowany typem InternalListElement klasa ListElement powinna zawierać metodę compareto, która będzie wykorzystywana przez metodę compareelements c) zrobić dziedziczenie w klasie Triangle z klasy ListElement, stworzyć listę elementów typu Triangle zarówno dla sposobu pierwszego jak i drugiego, sprawdzić, czy istnieją dwa trójkąty w liście o tym samym obwodzie Zadanie dodatkowe 1 Zaimplementować globalną funkcję wzorcową sort, która przyjmuje jako parametr listę jednokierunkową wzorcową z pierwszego zadania, oraz jako drugi parametr przyjmuje abstrakcyjną klasę wzorcową Comparator<T>, w której zadeklarowana jest metoda compareelements, odziedziczyć po klasie Comparator<T> komparator dla obiektów Triangle, porównujący pola, zamiast obwodów. Posortować tą funkcją przykładową listę obiektów typu Triangle. Zadanie dodatkowe 2 Zaimplementować wzorcową listę dwukierunkową z tymi samymi metodami co w zadaniu 1, InternalListElement zawiera referencję do poprzedniego i następnego obiektu - stworzyć abstrakcyjną klasę List, po której dziedziczą klasy OneDirectionList, TwoDirectionsList - przerobić funkcję sort, tak aby otrzymywała abstrakcyjną klasę List, zrobić przykładowe sortowanie obiektów Triangle