INTERFEJSY I KLASY WEWNĘTRZNE

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Programowanie obiektowe
Klasy abstrakcyjne i interfejsy
Programowanie obiektowe PO PO - LAB 2 Wojciech Pieprzyca.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Wzorce.
Prowadzący: mgr inż. Elżbieta Majka
Static, const, volatile.
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Generics w .NET 2.0 Łukasz Rzeszot.
Programowanie Obiektowe w Javie (c.d.)
Nguyen Hung Son Uniwersytet Warszawski
Programowanie obiektowe w Javie
OOP - programowanie zorientowane obiektowo w VB.NET
Serwery Aplikacji ASP .NET Web Objects Arkadiusz Popa.
Dziedziczenie i jego rodzaje
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Wstęp do programowania obiektowego
Java – programowanie obiektowe
Projektowanie i programowanie obiektowe II - Wykład II
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Podstawy programowania II
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Tworzenie aplikacji mobilnych
Programowanie obiektowe III rok EiT
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Programowanie obiektowe III rok EiT
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Marek Serek Dziedziczenie Dziedziczenie to jeden z fundamentów programowania obiektowego. Umożliwia sprawne i łatwe wykorzystywanie.
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 7 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Programowanie w języku C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Diagram klas Kluczowymi elementami są: klasy (class)
Kurs języka C++ – wykład 4 ( )
Klasy ( uzupełnienie ). Definicja klasy Klasa jest zbiorem logicznie powiązanych danych i funkcji, przeznaczonych do realizacji konkretnego zadania; Zamknięcie.
Projektowanie obiektowe. Przykład: Punktem wyjścia w obiektowym tworzeniu systemu informacyjnego jest zawsze pewien model biznesowy. Przykład: Diagram.
Dziedziczenie wielobazowe. dana klasa może mieć kilka bezpośrednich klas bazowych: dana klasa może mieć kilka bezpośrednich klas bazowych: kolorpołożenie.
Programowanie Zaawansowane
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
Partnerstwo dla Przyszłości 1 Lekcja 28 Dziedziczenie i rodzaje dziedziczenia.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Programowanie Obiektowe – Wykład 6
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
(c) Krzysztof Barteczko 2014
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Klasy wewnętrzne. Praktyka użycia interfejsów i klas wewnętrznych
Programowanie obiektowe – zastosowanie języka Java SE
PGO Interfejsy Michail Mokkas.
PGO Dziedziczenie Michail Mokkas.
PGO Porównywanie obiektów
Zapis prezentacji:

INTERFEJSY I KLASY WEWNĘTRZNE Artur Szwabowicz 140907

Interfejs Interfejs jest to spolszczenie angielskiego słowa interface, które na polski bywa tłumaczone jako styk. interfejs klasy - w językach obiektowych abstrakcyjna reprezentacja klasy pozwalająca na wykorzystywanie jej bez odwoływania się do konkretnej implementacji, interfejs (urządzenie) - urządzenie elektroniczne lub optyczne pozwalające na komunikację między dwoma innymi urządzeniami, których bezpośrednio nie da się ze sobą połączyć, interfejs użytkownika - oprogramowanie pozwalające na interakcję między aplikacjami i użytkownikiem: interfejs graficzny - interfejs użytkownika komunikujący stan programu w postaci graficznej na ekranie (lub wyświetlaczu), który jako wejście wykorzystuje urządzenie wskazujące (myszkę, touchpad, tablet, joystick, itp.) i klawiaturę, interfejs tekstowy - interfejs użytkownika komunikujący stan aplikacji w postaci znaków na ekranie (lub wyświetlaczu), wykorzystujący jako wejście z reguły tylko klawiaturę.

Interfejs Słowo kluczowe interface Interfejsy Javy rozwiązują problem wielokrotnego dziedziczenia, gdyż zapewniają znaczną część korzyści, jakie w przypadku wielokrotnego dziedziczenia daje możliwość wykorzystania polimorfizmu, a jednocześnie chroni nas przed problemem „śmiertelnego rombu” – wymuszają by wszystkie metody były abstrakcyjne! Klasa potomna musi zaimplementować wszystkie metody (wszystkie metody abstrakcyjne muszą zostać zaimplementowane w pierwszej konkretnej klasie potomnej). Interfejs informuje: „Oto jak będą wyglądać wszystkie klasy implementujące mnie.”

Obie klasy – NagrywarkaCD oraz NagrywarkaDVD dziedziczą po klasie NagrywarkaCyfrowa i obie przesłaniają metodę zapisz(). Obie dziedziczą także składową i typu int. Interfejs a Rozwiązania wykorzystujące „dwie klasy bazowe” przysparzają tylko jednego problemu... Nosi ono nazwę „wielokrotnego dziedziczenia” i może być naprawdę niebezpieczne. To znaczy – mogłoby być – gdyby tylko można je było wykorzystać w Javie. Jednak nie jest, gdyż wielokrotne dziedziczenie może doprowadzić do powstania problemu nazywanego „śmiertelnym rombem”. Oto problem, jakiego przysparza wielokrotne dziedziczenie. Która z metod zapisz() zostanie wywołana w przypadku wywołania tej metody dla obiektu NapedCombo?

Ale, co zrobić aby klasy Pies i Kot mogły wykonywać czynności charakterystyczne dla klasy ZwierzakDomowy. Interfejs W drzewie dziedziczenie zwierząt, klasy Zwierze, Psowate i Kotowate zdefiniowano jako klasy abstrakcyjne, a „liście” tego drzewa są klasami konkretnymi.

Można umieścić wszystkie metody klasy ZwierzakDomowy w klasie Zwierze Interfejs Można umieścić wszystkie metody klasy ZwierzakDomowy w klasie Zwierze

Interfejs Można umieścić wszystkie metody klasy ZwierzakDomowy w klasie Zwierze, lecz zadeklarować je jako metody abstrakcyjne.

Interfejs Można umieścić metody charakterystyczne dla zwierzaków domowych wyłącznie w klasach, w jakich powinny się znaleźć.

Na pomoc spieszą interfejsy. Wygląda na to, że na samej górze hierarchii dziedziczenia potrzebujemy DWÓCH klas.

Na pomoc spieszą interfejsy.

Zamiast słowa kluczowego „class” należy użyć słowa „interface”. Interfejs Interfejs przypomina całkowicie abstrakcyjną klasę. Zamiast słowa kluczowego „class” należy użyć słowa „interface”. Wszytkie metody wchodzące w skłąd interfejsu są abstrakcyjne, zatem wszystkie klasy, które spełniają relację JEST z interfejsem, MUSZĄ te metody implementować (czyli przesłaniać). Aby ZDEFINIOWAĆ interfejs: public interface ZwierzakDomowy {...} Aby ZAIMPLEMENTOWAĆ interfejs: public class Pies extends Psowate implements ZwierzakDomowy {...}

A to są zwyczajnie przysłaniane metody klasy Zwierze. Interfejs Skoro chce być zwierzakiem domowym, zatem musi zaimplementować metody tworzące interfejs ZwierzakDomowy. public interface ZwierzakDomowy { public abstract void badzMilutki(); public abstract void bawSie(); } public class Pies extends Psowate implements ZwierzakDomowy { public void badzMilutki() {...} public void bawSie() {...} public void wedruj() {...} public void jedz() {...} A to są zwyczajnie przysłaniane metody klasy Zwierze.

Interfejs Ten sam interfejs mogą implementować klasy pochodzące z różnych drzew dziedziczenia.

Interfejs Każde pole umieszczone w interfejsie staje się automatycznie statyczne i finalne. // Użycie interfejsów do grupowania stałych. public interface Miesiace { int JANUARY = 1, FEBRUARY = 2, MARCH = 3, APRIL = 4, MAY = 5, JUNE = 6, JULY = 7, AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10, NOVEMBER = 11, DECEMBER = 12; } Wyrażenie Miesiace.MAY zwróci wartość typu int równą 5. W Javie przyjęto zwyczaj stosowania wyłącznie wielkich liter w nazwach pól typu static final, posiadających stałe wartości inicjalizujące.

Interfejs W następnym przykładzie pokazano, iż: Klasa może implementować więcej niż jeden interfejs. Wszystkie nazwy interfejsów umieszczamy po słowie implements i rozdzielamy przecinkami. W następnym przykładzie pokazano, iż: można połączyć klasę konkretną z kilkoma interfejsami w celu stworzenia nowej klasy po interfejsach można dziedziczyć – otrzymujemy wtedy kolejny interfejs

W klasie Adventure występują cztery metody pobierające jako argumenty różne interfejsy oraz klasę konkretną Klasa Hero dziedziczy po ActionCharacter, dlatego nie implementuje metody fight(). Obiekt Hero może być przekazywany do wszystkich tych metod, co oznacza, że możliwe jest rzutowanie na każdy z interfejsów. Interfejs // Wiele interfejsów. interface CanFight { void fight(); } interface CanSwim { void swim(); interface CanFly { void fly(); class ActionCharacter { public void fight() { } class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly { public void swim() { } public void fly() { } } public class Adventure { public static void t(CanFight x) { x.fight(); } public static void u(CanSwim x) { x.swim(); } public static void v(CanFly x) { x.fly(); } public static void w(ActionCharacter x) { x.fight(); } public static void main(String[] args) { Hero h = new Hero(); t(h); // Obiekt Hero jako CanFight u(h); // Obiekt Hero jako CanSwim v(h); // Obiekt Hero jako CanFly w(h); // Obiekt Hero jako ActionCharacter

Interfejs Dają nam możliwość rzutowania na kilka typów bazowych. Po co są interfejsy? Dają nam możliwość rzutowania na kilka typów bazowych. Uniemożliwiają programiście tworzenie obiektów naszej klasy.

Interfejs Kiedy powinniśmy stosować interfejsy a kiedy klasy abstrakcyjne? Interfejs daje nam korzyści zapewniane przez abstrakcyjność klas oraz dodatkowe – wynikające z bycia interfejsem. Jeżeli możliwe jest stworzenie klasy bazowej bez definiowania żadnych metod lub zmiennych składowych, powinniśmy zawsze wybierać interfejsy, a nie klasy abstrakcyjne.

Klasy wewnętrzne Możliwe jest umieszczenie definicji klasy wewnątrz innej definicji klasy. Klasy wewnętrzne umożliwiają grupowanie logicznie powiązanych ze sobą klas i kontrolowanie widoczności jednych w drugich.

Klasy wewnętrzne class MojaKlasaZewnetrzna { class MojaKlasaWewnetrzna Aby utworzyć klasę wewnętrzną, należy upewnić się, że definicja klasy wewnętrznej znajduje się wewnątrz nawiasów klamrowych klasy zewnętrznej. class MojaKlasaZewnetrzna { class MojaKlasaWewnetrzna void doDziela() {...} }

Klasy wewnętrzne Klasa wewnętrzna może używać wszystkich składowych i metod klasy zewnętrznej, nawet tych prywatnych. Klasa wewnętrzna może się posługiwać składowymi i metodami klasy zewnętrznej jak gdyby były zadeklarowane w niej samej.

Te dwa obiekty przebywające na stercie łączy szczególna więź. Klasy wewnętrzne Obiekt klasy wewnętrznej musi być związany z konkretnym obiektem klasy zewnętrznej przechowywanym na stercie. Obiekt wewnętrzny oraz zewnętrzny są ze sobą powiązane w szczególny sposób. Utwórz obiekt klasy zewnętrznej. Utwórz obiekt klasy wewnętrznej używając przy tym obiektu klasy zewnętrznej. Teraz obiekt klasy zewnętrznej oraz obiekt klasy wewnętrznej są ze sobą połączone w szczególny sposób. Te dwa obiekty przebywające na stercie łączy szczególna więź. Obiekt wewnętrzny może korzystać ze składowych obiektu zewnętrznego (i na odwrót).

Klasy wewnętrzne Klasa zewnętrzna ma składową prywatną o nazwie „x” class MojaKlasaZewnetrzna { private int x; MojaKlasaWewnetrzna wew = new MojaKlasaWewnetrzna(); public void zrobCos() wew.doRoboty(); } class MojaKlasaWewnetrzna void doRoboty() x = 42; Utworzenie obiektu klasy wewnętrznej Wywołanie metody klasy wewnętrznej Metoda klasy wewnętrznej używa składowej „x” klasy zewnętrznej

Klasy wewnętrzne Istnieje możliwość utworzenia obiektu klasy wewnętrznej z poziomu kodu działającego poza klasą zewnętrzną, jednak należy w tym celu użyć specjalnej składni. class Tmp { public static void main(String[] args) KlasaZewnetrzna objZew = new KlasaZewnetrzna(); KlasaZewnetrzna.KlasaWewnetrzna objWew = objZew.new KlasaWewnetrzna(); }

Klasy wewnętrzne Nasze programy mogą zawierać: Klasę zdefiniowaną wewnątrz metody. Klasę zdefiniowaną wewnątrz zasięgu określonego w metodzie. Anonimową klasę implementującą interfejs. Anonimową klasę rozszerzającą klasę posiadającą konstruktor inny od domyślnego. Anonimową klasę przeprowadzającą inicjalizację pól. Anonimową klasę przeprowadzającą konstrukcje zawierającą inicjalizacje instancji (anonimowe klasy wewnętrzne nie mogą mieć konstruktorów).

Klasy wewnętrzne Co sprawia, że klasy wewnętrzne są ważne? Dają nam możliwość kilkukrotnego zaimplementowania tego samego interfejsu w jednej klasie. Należy pamiętać, ze w normalnej klasie Javy nie można zaimplementować metody więcej niż jeden raz. Jednak stosując klasy wewnętrzne, każda z nich może implementować ten sam interfejs, dzięki czemu można stworzyć różne implementacje tej samej metody interfejsu.

Interfejsy i klasy wewnętrzne Dziękuję za uwagę Artur Szwabowicz