Klasy abstrakcyjne i interfejsy



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

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

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

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Monika Wrzosek (IM UG) Programowanie obiektowe 21 / 25

Klasy abstrakcyjne, interfejsy i polimorfizm

Typy sparametryzowane

Dziedziczenie. dr Jarosław Skaruz

Dziedziczenie. Tomasz Borzyszkowski

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

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

Aplikacje w środowisku Java

Programowanie obiektowe

Dokumentacja do API Javy.

Programowanie obiektowe

Programowanie obiektowe

Java: interfejsy i klasy wewnętrzne

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

Programowanie obiektowe

Kurs WWW. Paweł Rajba.

Wykład 8: klasy cz. 4

TEMAT : KLASY DZIEDZICZENIE

Polimorfizm. dr Jarosław Skaruz

Interfejsy i klasy wewnętrzne

Wykład 7: Pakiety i Interfejsy

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie obiektowe

PHP 5 język obiektowy

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie obiektowe

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie w Javie wykład 8 Interfejsy

Programowanie w Internecie. Java

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

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

Programowanie obiektowe i zdarzeniowe

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 2. Język C++. Wykład 9.

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

Programowanie obiektowe

10. Programowanie obiektowe w PHP5

Pakiety i interfejsy. Tomasz Borzyszkowski

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

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

Wykład 6: Dziedziczenie

.NET Klasy, obiekty. ciąg dalszy

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Dziedziczenie jednobazowe, poliformizm

Wykład 9: Polimorfizm i klasy wirtualne

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

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

Diagramy klas. dr Jarosław Skaruz

Programowanie obiektowe

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

Enkapsulacja, dziedziczenie, polimorfizm

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

Podstawy programowania III

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

Materiały do zajęć VII

Technologie i usługi internetowe cz. 2

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Programowanie obiektowe

Template method (metoda szablonowa)

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

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

Projektowanie obiektowe. Roman Simiński Polimorfizm

1 Atrybuty i metody klasowe

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

Programowanie obiektowe - 1.

Wykład 5: Klasy cz. 3

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

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

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

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

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

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

Programowanie obiektowe. Wykład 03. Maciej Wołoszyn 17 marca Polimorfizm oraz wczesne i późne wiazanie

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

Wykład 5 Okna MDI i SDI, dziedziczenie

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

Programowanie obiektowe w języku

Aplikacje RMI

Dziedziczenie i interfejsy

Programowanie obiektowe

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

Języki programowania imperatywnego

Java Język programowania

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

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

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

Czym jest polimorfizm?

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

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

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

Programowanie obiektowe

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

Języki i techniki programowania Ćwiczenia 4 Wzorce

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 2

Transkrypt:

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 tylko matematycznego) składa się z trzech czynności: wprowadzenia danych, znalezienia rozwiązania i wypisania wyników. Oczywiście ważne jest, aby te czynności wykonane były zawsze. Ponadto zawsze w wymienionej kolejności. Nie ma sensu wypisywać wyniku przed znalezieniem rozwiązania, ani szukać tego rozwiązania zanim wprowadzi się dane wejściowe. Przykładowa klasa opisująca zadanie może więc wyglądać: class Zadanie void wprowadzdane() void dyskusjarozwiazania() void wypiszwyniki() void rozwiaz() wprowadzdane(); dyskusjarozwiazania(); wypiszwyniki(); W celu ułatwienia stosowania tej klasy, wygodne jest, aby zawierała ona metodę void rozwiaz(). Użytkownik klasy, chcąc rozwiązać konkretne zadanie, zamiast wywoływania trzech metod Zadanie z = new Zadanie(); z.wprowadzdane(); z.dyskusjarozwiazania(); z.wypiszwyniki(); może zrealizować cel wywołując tylko jedną 1

Zadanie z = new Zadanie(); z.rozwiaz(); Zwalniamy użytkownika z konieczności pamiętania nazw kilku metod oraz pamiętania kolejności ich wywołania. Zwróćmy uwagę, że na razie nie mówimy o żadnym konkretnym zagadnieniu, nie mówimy też o ilości danych wejściowych ani wyjściowych. Dlatego metody void wprowadzdane(), void dyskusjarozwiazania() i void wypiszwyniki() mają puste implementacje. Ich nazwy muszą się jednak pojawić, aby mogły być użyte w funkcji void rozwiaz(). Metody i klasy abstrakcyjne W sytuacjach, gdy pewne metody są definiowane w klasach tylko po to, aby wprowadzić nazwy, a ich definicje są puste, możemy zastosować tak zwane metody abstrakcyjne. Osoby po kursie programowania w C++ znają to pojęcie. W C++ metodę abstrakcyjną definiowało się opuszczając jej definicję, a stosując zapis virtual void f() = 0;, gdzie typ void oraz nazwa f mogą być dowolne. W Javie metody abstrakcyjne deklaruje się stosując kwalifikator abstract, np.: abstract void f();. Ponownie, typ void oraz nazwa f mogą być dowolne. Ponadto, jeśli w klasie jest zadeklarowana przynajmniej jedna metoda abstrakcyjna, to cała klasa staje się klasą abstrakcyjną, i jako taka wymaga kwalifikatora abstract przed słowem class, np. abstract class Zadanie abstract void wprowadzdane(); abstract void dyskusjarozwiazania(); abstract void wypiszwyniki(); void rozwiaz() wprowadzdane(); dyskusjarozwiazania(); wypiszwyniki(); Klasy abstrakcyjne mają jedno bardzo ważne ograniczenie: nie wolno generować obiektów klas abstrakcyjnych. Na program Zadanie z = new Zadanie(); 2

kompilator reaguje następująco: Rownania.java:46: Zadanie is abstract; cannot be instantiated Zadanie r1 = new Zadanie(); Zatem w jaki sposób wykorzystać metody i klasy abstrakcyjne? Rozwiązanie jest w miarę oczywiste: należy zdefiniować klasę potomną klasy abstrakcyjnej i nadpisać w niej metody abstrakcyjne (ukonkretnić je). Przy czym nie ma obowiązku nadpisywania wszystkich metod abstrakcyjnych w bezpośrednim potomku, ale w którymś z potomków. Pierwsza klasa potomna klasy abstrakcyjnej, w której ukonkretni się wszystkie metody abstrakcyjne staje się klasą konkretną (nie wymagany jest kwalifikator abstract) i dopiero dla niej można generować obiekty. Rozwijając nasz przykład możemy zdefiniować klasę modelującą na przykład układ dwóch równań z dwoma niewiadomymi następująco: class UkladRownanZDwomaZmiennymi extends Zadanie @Override void wprowadzdane() @Override void dyskusjarozwiazania() @Override void wypiszwyniki() i wykorzystać ją do rozwiązania konkretnego równania: Zadanie r = new UkladRownanZDwomaZmiennymi(); r.rozwiaz(); Celem wykładu nie jest prezentacja rozwiązywania układów równań, zatem definicje metod pozostawiamy puste. Interfejsy Rozszerzeniem języka Java w stosunku do C++ jest wprowadzenie nowej kategorii klas interfejsów. Interfejs, to klasa, której domyślnie wszystkie metody są abstrakcyjne i publiczne, a pola statyczne i finalne. Deklarując metody w interfejsie nie wymaga się kwalifikatora abstract, a sam interfejs definiuje się stosując słowo interface zamiast class, np.: interface Interfejs void f1(); void f2(); int czerwony = 3; 3

W jaki sposób wykorzystuje się interfejsy? Chcąc użyć dany interfejs, po nazwie klasy stosuje się słowo implements i nazwę interfejsu, np. class Klasa implements Interfejs public void f1() public void f2() W klasie implementuje się metody zdefiniowane w użytym interfejsie, pamiętając o kwalifikatorze public. Przypomnijmy, że wszystkie metody interfejsów są publiczne. Jeśli dana klasa nie ukonkretni wszystkich metod użytego interfejsu, to taka klasa pozostaje klasą abstrakcyjną z wszelkimi tego konsekwencjami opisanymi wyżej. Java jest językiem obiektowym jednobazowym. To znaczy może mieć maksymalnie jednego bezpośredniego przodka. Reguła ta jest złamana w przypadku interfejsów klasa może implementować wiele interfejsów. Ich nazwy podajemy jako lista rozdzielana przecinkami po słowie implements. Klasa, aby nie być abstrakcyjną, musi ukonkretnić wszystkie metody wszystkich implementowanych interfejsów. Dziedziczenie interfejsów przez interfejsy Interfejs może być dziedziczony przez inne interfejsy, np.: interface I1 interface I2 interface J1 extends I1 class K implements I2,J1 Interfejsy I1, I2 są niezależne między sobą. Interfejs J1 dziedziczy interfejs I1. Klasa K implementuje interfejsy I2 oraz J1. Generowanie obiektów typu interfejsu Aby wykorzystać interfejs, nie jest konieczne tworzenie klasy implementującej dany interfejs. Java dopuszcza generowanie obiektów typu interfejsu, wykorzystując tak zwane klasy anonimowe, klasy bez nazw. Mając interfejs o nazwie Interfejs z przykładu wyżej, generujemy obiekt wskazywany przez referencję i następująco: class X Interfejs i = new Interfejs() //początek klasy anonimowej public void f1() public void f2() ; i.f1(); 4

Kompletny przykład interface IZadanie void wprowadzdane(); void dyskusjarozwiazania(); void wypiszwyniki(); abstract class Zadanie implements IZadanie void rozwiaz() wprowadzdane(); dyskusjarozwiazania(); wypiszwyniki(); class UkladRownanZDwomaZmiennymi extends Zadanie @Override public void wprowadzdane() @Override public void dyskusjarozwiazania() @Override public void wypiszwyniki() Zadanie r = new UkladRownanZDwomaZmiennymi(); r.rozwiaz(); 5

Podsumowanie Metodę abstrakcyjną definiuje się stosując kwalifikator abstract przed typem wyniku funkcji. Jeśli klasa posiada przynajmniej jedną metodę abstrakcyjną, to klasa jest abstrakcyjna i wymagany jest kwalifikator abstract przed słowem class. Nie można generować obiektów klas abstrakcyjnych. Interfejsy definiuje się stosując słowo interface. Wszystkie metody interfejsów są domyślnie abstrakcyjne i publiczne. Wszystkie pola interfejsów są domyślnie statyczne i finalne i jako takie wymagają nadania wartości w momencie definicji. Klasa wykorzystuje interfejs stosując słowo implements. Klasa może implementować kilka interfejsów. Interfejsy mogą być dziedziczone przez interfejsy. Interfejsy nie mogą dziedziczyć klas. Można generować obiekty typu interfejs. 6