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

Podobne dokumenty
Programowanie obiektowe

Dawid Gierszewski Adam Hanasko

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

Programowanie w środowiskach graficznych. Wykład 3 Język C#

Typy uogólnione. Programowanie obiektowe. Jacek Sroka na podstawie materiałów Janusza Jabłonowskiego. 8 kwietnia 2013

TYPY GENERYCZNE (GENERICS)

Kurs programowania. Wykład 9. Wojciech Macyna

Polimorfizm a klasy generyczne w języku Java. Zdzisław Spławski 1

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Platformy Programistyczne Podstawy języka Java

Programowanie obiektowe

Programowanie w środowiskach graficznych. Wykład 4 Język C# cd

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

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

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

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

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

Enkapsulacja, dziedziczenie, polimorfizm

Podstawy programowania obiektowego

Metody sparametryzowane

Java niezbędnik programisty spotkanie nr 9. Java 2 Platform, Standard Edition 5.0

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

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

Programowanie obiektowe

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podstawy Programowania

Aplikacje w środowisku Java

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

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Dziedziczenie. dr Jarosław Skaruz

Programowanie i projektowanie obiektowe

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

Programowanie Komputerów

Klasy i obiekty cz II

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Wykład 5 Okna MDI i SDI, dziedziczenie

Java: interfejsy i klasy wewnętrzne

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Systemy Rozproszone - Ćwiczenie 6

Przypomnienie o klasach i obiektach

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

Wykład 8: Obsługa Wyjątków

Tworzenie aplikacji w języku Java

Kolekcje w Javie cz. 1

Dokumentacja do API Javy.

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Typy uogólnione. Robert A. Kªopotek Wydziaª Matematyczno-Przyrodniczy. Szkoªa Nauk cisªych, UKSW

Programowanie w Javie wykład 8 Interfejsy

10. Programowanie obiektowe w PHP5

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 4: Klasy i Metody

Podstawy otwartych języków programowania Przechowywanie danych

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

Szablony funkcji i klas (templates)

Klasy abstrakcyjne i interfejsy

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

Szablony funkcji i szablony klas

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Klasy cd. Struktury Interfejsy Wyjątki

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

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Polimorfizm. dr Jarosław Skaruz

Imi i nazwisko... Egzamin - Programowanie Obiektowe II rok informatyki, studia pierwszego stopnia, niestacjonarne Termin zerowy

Scala. Obiektowo-funkcyjny język programowania. Zbyszek Skowron

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

Generatory. Michał R. Przybyłek

Wstęp do ruby dla programistów javy

Współbieżność w środowisku Java

Typy sparametryzowane

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

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

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe

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

KOTLIN. Język programowania dla Androida

Programowanie obiektowe

UML a kod. C++, Java i C#

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

Przykład -

Programowanie obiektowe

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Czym jest stos i sterta?

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Programowanie obiektowe


Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Metody Metody, parametry, zwracanie wartości

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Programowanie w języku Java. Kolekcje

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie obiektowe

Programowanie obiektowe

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Programowanie obiektowe i zdarzeniowe

Lista, Stos, Kolejka, Tablica Asocjacyjna

Transkrypt:

Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki

Problem: Jak zaimplementować stos? Co się stanie gdy dodamy do stosu obiekt typu Czlowiek? Co się stanie, gdy spróbujemy ten obiekt odczytać ze stosu? class EltStosu public Object elt; public EltStosu nast; public EltStosu(Object elt, EltStosu nast) this.elt = elt; this.nast = nast; public class Stos private EltStosu wierzch; public Stos() wierzch = null; public boolean Pusty() return wierzch == null; public void Wstaw(Object elt) wierzch = new EltStosu(elt, wierzch); public Object Pobierz() if (Pusty()) throw new InvalidOperationException(); Object wynik = wierzch.elt; wierzch = wierzch.nast; return wynik; Typy uogólnione 2

Czlowiek os1 = new Czlowiek("Jasio"); Stos s = new Stos(); s.wstaw(os1); Czlowiek os2 = s.pobierz(); //błąd Czlowiek os3 = (Czlowiek)s.Pobierz(); //OK Kompilator nie wie jakiego typu jest obiekt przechowywany na stosie Konieczność rzutowania Brak sprawdzania typów Typy uogólnione 3

Rozwiązanie: Typ jako parametr klasy lub metody class EltStosu<T> public T elt; public EltStosu<T> nast; public EltStosu(T elt, EltStosu<T> nast) this.elt = elt; this.nast = nast; Czlowiek os1 = new Czlowiek("Jasio"); Stos<Czlowiek> s = new Stos<Czlowiek>(); s.wstaw(os1); Czlowiek os2 = s.pobierz(); //OK public class Stos<T> private EltStosu<T> wierzch; public Stos() wierzch = null; public boolean Pusty() return wierzch == null; public void Wstaw(T elt) wierzch = new EltStosu<T>(elt, wierzch); public T Pobierz() if (Pusty()) throw new InvalidOperationException(); T wynik = wierzch.elt; wierzch = wierzch.nast; return wynik; Typy uogólnione 4

Typy uogólnione (typy generyczne) pozwalają parametryzować klasy i metody typami Dzięki temu można tworzyć silnie typowane metody dla wielu typów Brak jawnego rzutowania W Javie zaimplementowane przez wymazywanie typów (działa tylko dla typów referencyjnych) W C# zaimplementowane z wykorzystaniem dodatkowych instrukcji języka pośredniego Typy uogólnione 5

Parametryzować typami można: Klasy Metody public class Para<T1, T2> public Para(T1 pierwszy, T2 drugi) this.pierwszy = pierwszy; this.drugi = drugi; public T1 Pierwszy get; private set; public T2 Drugi get; private set; static void Zamien<U>(ref U lhs, ref U rhs) U temp; temp = lhs; lhs = rhs; rhs = temp; public static void TestZamiany() int a = 1; int b = 2; Zamien<int>(ref a, ref b); Zamien(ref a, ref b); Para<int,int> p = new Para<int,int>(2,3); Typy uogólnione 6

Parametryzować typami można: Klasy Metody public class Para<T1, T2> public Para(T1 pierwszy, T2 drugi) this.pierwszy = pierwszy; this.drugi = drugi; public T1 Pierwszy get; private set; public T2 Drugi get; private set; static void Zamien<T>(ref T lhs, ref T rhs) T temp; temp = lhs; lhs = rhs; rhs = temp; public static void TestZamiany() int a = 1; int b = 2; Zamien<int>(ref a, ref b); Zamien(ref a, ref b); Para<int,int> p = new Para<int,int>(2,3); Typy uogólnione 7

Java Wskazanie typu i interfejsów nadrzędnych public class GenericClass<T extends Number & Comparable<T>> void print(t t) System.out.println(o()); // OK Dżokery (wildcards) static void printall (Collection<?> c) for (Object o : c) System.out.println(o); static <T> void copy(list<? extends T> source, List<? super T> dest) for (T t : source) dest.add(t); Typy uogólnione 8

C# Wskazanie typu i interfejsów nadrzędnych Wymaganie żeby T był klasą Wymaganie żeby T był strukturą Wymaganie żeby T miał domyślny konstruktor static void Copy<T, U, V, W> (IEnumerable<T> source, ICollection<U> dest) where T : U, IComparable<T>, new() where U : new() where V : class where W : struct foreach (T t in source) dest.add (t); Typy uogólnione 9

Dlaczego ten kod zadziała Czlowiek[] array = new Student[10]; a ten nie? ArrayList<Czlowiek> list = new ArrayList<Student>(); Typy uogólnione 10

Dlaczego ten kod zadziała Czlowiek[] array = new Student[10]; a ten nie? ArrayList<Czlowiek> list = new ArrayList<Student>(); Bo tablice w Javie i C# są kowariantne a typy generyczne nie. Typy uogólnione 11

W C# można sterować wariancją typów generycznych Kowariancja (np. IEnumerable<T>) List<Czlowiek> list = new List<Student>(); // Bo definicja IEnumerable wygląda tak public interface IEnumerable<out T> : IEnumerable Kontrawariancja (np. Action<T>) Action<Student> action = new Action<Czlowiek>(); // Bo definicja Action wygląda tak public delegate void Action<in T>(T obj) Typy uogólnione 12

Java: T obj = new T(); //błąd C#: T obj = new T(); //OK Java: obj instanceof T //błąd C#: obj is T //OK Java: public Stos<String>[] x = new Stos<String>[6]; //błąd C#: public Stos<string>[] x = new Stos<string>[6]; //OK Typy uogólnione 13

W Javie jeśli chcemy stworzyć typ generyczny przechowujący typy proste, będzie musiało być wykonywane opakowywanie (boxing/unboxing) Wolniejsze przetwarzanie kolekcji typów prostych w Javie W C# typ generyczny jest znany podczas wykonywania programu, w Javie ten typ jest gubiony Możliwe korzystanie z refleksji na typach generycznych w C# Typy uogólnione 14