Klasy abstrakcyjne, interfejsy i polimorfizm

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

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Dziedziczenie. dr Jarosław Skaruz

Polimorfizm. dr Jarosław Skaruz

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

Klasy abstrakcyjne i interfejsy

Dokumentacja do API Javy.

Java: interfejsy i klasy wewnętrzne

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wykład 6: Dziedziczenie

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Dziedziczenie. Tomasz Borzyszkowski

Programowanie obiektowe

Programowanie obiektowe

Wykład 7: Pakiety i Interfejsy

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

Kurs WWW. Paweł Rajba.

Programowanie obiektowe

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Programowanie w Internecie. Java

Pakiety i interfejsy. Tomasz Borzyszkowski

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

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

Aplikacje w środowisku Java

Programowanie obiektowe i zdarzeniowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

PHP 5 język obiektowy

Programowanie obiektowe

Programowanie w Javie wykład 8 Interfejsy

Technologie i usługi internetowe cz. 2

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

Dziedziczenie w Javie

Programowanie obiektowe w języku

Podstawy Języka Java

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

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe

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

Programowanie obiektowe

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

Dziedziczenie i interfejsy

Programowanie obiektowe - 1.

.NET Klasy, obiekty. ciąg dalszy

Programowanie obiektowe

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

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

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

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

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

Programowanie obiektowe

Materiały do zajęć VII

Podstawy programowania III

Definiowanie własnych klas

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

Platformy Programistyczne Podstawy języka Java

Przypomnienie o klasach i obiektach

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

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Typy sparametryzowane

Interfejsy i klasy wewnętrzne

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

Projektowanie obiektowe. Roman Simiński Polimorfizm

MAS dr. Inż. Mariusz Trzaska. Realizacja różnych modeli dziedziczenia w obiektowych językach programowania

10. Programowanie obiektowe w PHP5

Programowanie w Javie - wykład 3

Programowanie obiektowe

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

Klasy cd. Struktury Interfejsy Wyjątki

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

1. Klasa typu sealed. Przykład 1. sealed class Standard{ class NowyStandard:Standard{ // błd!!!

Modelowanie obiektowe

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

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

Dawid Gierszewski Adam Hanasko

Programowanie obiektowe

Diagramy klas. dr Jarosław Skaruz

Programowanie obiektowe

Java Język programowania

Podstawy programowania obiektowego

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

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

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

1 Atrybuty i metody klasowe

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

Dziedziczenie jednobazowe, poliformizm

Dziedziczenie. » Dodawanie nowych elementów klasy (składowych funkcyjnych, danych składowych)» Modyfikacje odziedziczonych składowych funkcyjnych

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

TEMAT : KLASY DZIEDZICZENIE

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Programowanie obiektowe

Programowanie obiektowe

Java SE Laboratorium nr 2. Temat: Obiektowość

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

Przykład -

Transkrypt:

Programowanie obiektowe 12 kwietnia 2011

Organizacyjne Klasówka będzie 20 IV 2011. Sale jeszcze są pertraktowane. Materiał do wyjątków włącznie. Można mieć swoje materiały nieelektroniczne.

Wywołanie z super może nie być intuicyjne 1 2 public class A { 3 public void m1 ( ) { System. out. p r i n t l n ( "A" ) ; } 4 } 5 6 public class B extends A{ 7 public void m2 ( ) { 8 System. out. p r i n t ( " super.m1( ) > " ) ; 9 super.m1 ( ) ; 10 System. out. p r i n t ( " t h i s.m1( ) > " ) ; 11 this.m1 ( ) ; 12 } 13 14 @Override 15 public void m1 ( ) { System. out. p r i n t l n ( "B" ) ; } 16 }

Wywołanie z super może nie być intuicyjne 1 2 public class C extends B{ 3 public void m3 ( ) { 4 m2 ( ) ; / / Czy wypisze A czy B? 5 } 6 @Override 7 public void m1 ( ) { System. out. p r i n t l n ( "C" ) ; } 8 }

Wywołanie z super może nie być intuicyjne 1 B b = new B ( ) ; 2 b.m2 ( ) ; 3 C c = new C ( ) ; 4 c.m2 ( ) ; 5 c.m3 ( ) ; I wynik: super.m1() -> A this.m1() -> B super.m1() -> A this.m1() -> C super.m1() -> A this.m1() -> C

Klasy abstrakcyjne Nie mają obiektów (bezpośrednio swojej klasy). Kompilator odrzuci próbę utworzenia obiektu takiej klasy. Są bardzo ważne! Pozwalają wyabstrahować wspólne cechy wielu pojęć (klas). Zapewniają wspólny interfejs dla swoich podklas. Zapewniają jednocześnie wspólną implementację. Typowe zastosowaie - wiele implementacji tego samego pojęcia. Klasy abstrakcyjne - klasy konkretne.

Składnia klas abstrakcyjnych Klasa abstrakcyjna jest deklarowana ze słowem abstract. Klasa abstrakcyjna nie musi mieć metod abstrakcyjnych, choć zwykle ma. Metoda abstrakcyjna jest deklarowana ze słowem abstract i nie może mieć treści. Musi być podmieniona na konkretną w konkretnych podklasach. Klasa, która nie podmieni choć jednej odziedziczonej metody abstrakcyjnej lub ma własną metode abstrakcyjną musi być zadeklarowana jako abstrakcyjna. Można wywoływać metody abstrakcyjne (dlaczego nie ma w tym nic gorszącego?). Można też podmienić metodę konkretną na abstrakcyjną!

Przykład klasy abstrakcyjnej 1 abstract class Pojemnik { 2 public abstract void dodaj ( i n t e l t ) ; 3 / / Powyższe jest ciekawe - wymusza implementację w podklasach 4 5 public void dodajtab ( i n t [ ] tab ) { 6 for ( i n t i : tab ) 7 dodaj ( i ) ; 8 } 9 / / Powyższe jest ciekawe - konkretna metoda w abstrakcyjnej klasie 10 / / wywołuje abstrakcyjną metodę 11 12 @Override 13 public abstract S t r i n g t o S t r i n g ( ) ; 14 / / Powyższe jest ciekawe - tostring było zdefiniowane w Object 15 } 16 17 / / Całe powyższe jest zatem ciekawe QED.

Przykład podklasy klasy abstrakcyjnej 1 public class PojemnikTablicowy extends Pojemnik { 2 / / Niezm.: dane są w tab[0..ile-1] 3 4 PojemnikTablicowy ( ) { 5 tab = new i n t [ 1 ] ; / / 1024 byłoby bardziej naturalne 6 } 7 8 private i n t [ ] tab ; 9 private i n t i l e =0;

Przykład podklasy klasy abstrakcyjnej cd 1 @Override 2 public void dodaj ( i n t e l t ) { 3 i f ( i l e >= tab. l e n g t h ) { 4 i n t [ ] pom = new i n t [ tab. l e n g t h 2 ] ; 5 for ( i n t i =0; i < i l e ; i ++) 6 pom[ i ] = tab [ i ] ; 7 / / System.arraycopy(tab, 0, pom, 0, ile); 8 tab = pom ; / / nie ma to jak automatyczne odśmiecanie :) 9 } 10 / / teraz już na pewno jest miejsce 11 tab [ i l e ++] = e l t ; 12 }

Przykład podklasy klasy abstrakcyjnej cd 1 @Override 2 public S t r i n g t o S t r i n g ( ) { 3 S t r i n g wyn= " [ " ; / / Powinien być StringBuilder 4 for ( i n t i =0; i < i l e 1; i ++) 5 wyn += tab [ i ] + ", " ; 6 i f ( i l e >0) 7 wyn+=tab [ i l e 1]; 8 wyn+= " ] " ; 9 return wyn ; 10 } / / tostring 11 } / / PojemnikTablicowy

Przykład użycia tej hierarchii klas 1 public s t a t i c void t e s t ( ) { 2 i n t [ ] dane = { 1, 3, 8, 2, 5, 9, 8 } ; 3 Pojemnik p = new PojemnikTablicowy ( ) ; 4 System. out. p r i n t l n ( " p = " + p ) ; 5 for ( i n t e l t : dane ) 6 p. dodaj ( e l t ) ; 7 System. out. p r i n t l n ( " p = " + p ) ; 8 p. dodajtab ( dane ) ; 9 System. out. p r i n t l n ( " p = " + p ) ; 10 } I wynik: p = [] p = [1, 3, 8, 2, 5, 9, 8] p = [1, 3, 8, 2, 5, 9, 8, 1, 3, 8, 2, 5, 9, 8]

Przykład dziwnej hierarchii klas 1 public abstract class AbstrakcyjnaA { 2 public abstract void m( ) ; 3 } 4 5 public abstract class AbstrakcyjnaB extends AbstrakcyjnaA { 6 @Override 7 public abstract void m( ) ; 8 / / można podmienić abstrakcyjną metodę na abstrakcyjną, tylko po co? 9 } 10 11 public class KonkretnaC extends AbstrakcyjnaB { 12 @Override 13 public void m( ) { 14 System. out. p r i n t l n ( " AbstrakcyjnaC.m( ) " ) ; 15 } 16 }

Przykład dziwnej hierarchii klas 1 public abstract class AbstrakcyjnaD extends KonkretnaC { 2 / / klasa abstrakcyjna może dziedziczyć po konkretnej 3 } 4 5 public class KonkretnaE extends AbstrakcyjnaD { 6 } 7 8 AbstrakcyjnaA a = new KonkretnaE ( ) ; 9 a.m( ) ; I wynik: AbstrakcyjnaC.m()

Interfejsy Klasy abstrakcyjne bez żadnej implementacji. Jeszcze lepsza postać kontraktu. Nie da się utworzyć obiektu z interfejsu (ale można obiekt klasy impelmentującej interfejs). Można (i bardzo często tak się robi) zadeklarować zmienną o typie będącym interfejsem. Interfejs może dziedziczyć po interfejsie (używa się wtedy słowa extends). Interfejs nie może dziedziczyć po klasie. Tak klasa jak i interfejs mogą dziedziczyć po dowolnie wielu interfejsach. Interfejsy dają więc namiastkę wielodziedziczenia.

Składnia interfejsów Domyślnie wszystkie składowe są rozumiane jako publiczne (i słowa public nie pisze się. Stałe interfejsu to atrybuty z public, static final. Te modyfikatory są przyjmowane domyślnie. Nie mają składowych klasowych (tj. ze słowem static) poza stałymi. Nie mają składowych będących atrybutami (poza stałymi). Klasa dziedzicząca po interfejsie albo implementuje wszystkie jego metody (i wtedy może być konkretna lub może być abstrakcyjna), albo nie wszystkie (w szczególności żadnej) i wtedy musi być abstrakcyjna.

Składnia interfejsów Każdy interfejs niedziedziczący po innym niejawnie ma dodawane nagłówki publicznych metod klasy Object wszystko (prawie) w Javie jest obiektem. Interfejs może zawierać tylko: stałe (pola), metody, zagnieżdżone klasy i interfejsy.

Składnia interfejsów - interfejs Pojemnik 1 public interface Pojemnik { 2 void wstaw ( i n t i ) ; 3 i n t pobierz ( ) ; 4 boolean pusty ( ) ; 5 }