Przykład -

Podobne dokumenty
Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe

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

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

Programowanie obiektowe i zdarzeniowe

Wykład 7: Pakiety i Interfejsy

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Wykład 6: Dziedziczenie

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

Programowanie obiektowe

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

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

Programowanie obiektowe

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

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

Java: interfejsy i klasy wewnętrzne

Dokumentacja do API Javy.

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

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

Programowanie w Javie wykład 8 Interfejsy

Programowanie obiektowe

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Programowanie obiektowe

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

Enkapsulacja, dziedziczenie, polimorfizm

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie w Internecie. Java

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

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

Programowanie obiektowe

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

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

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

Programowanie obiektowe w języku

Java SE Laboratorium nr 2. Temat: Obiektowość

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

Aplikacje w środowisku Java

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

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

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

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

Systemy Rozproszone - Ćwiczenie 6

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

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

Klasy abstrakcyjne i interfejsy

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie obiektowe

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

Podstawa: Bruce Eckel, Thinking in Java, Second Ed., Prentice Hall, 1998 The JavaLanguage Environment, A white Paper, Sun, Oct.

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Języki i metody programowania Java Lab2 podejście obiektowe

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

Programowanie obiektowe

Dziedziczenie. dr Jarosław Skaruz

1 Atrybuty i metody klasowe

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Technologie i usługi internetowe cz. 2

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

KLASY, INTERFEJSY, ITP

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

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

Podstawy Języka Java

Programowanie w środowisku graficznym- wykład 5 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Interfejsy

Języki programowania imperatywnego

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

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Programowanie w Javie - wykład 3

Podejście obiektowe do budowy systemów rozproszonych

Wykład 5: Więcej o Klasach i Metodach

Programowanie obiektowe

Języki i metody programowania Java INF302W. Wykład 1 (część 1) na podstawie Autor Dr inż. Zofia Kruczkiewicz

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

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

TYPY GENERYCZNE (GENERICS)

DOSTĘP DO METOD I ZMIENNYCH. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla każdego, Helion 2001)

Dziedziczenie. Tomasz Borzyszkowski

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

Projektowanie obiektowe. Roman Simiński Polimorfizm

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

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

Wykład 4: Klasy i Metody

Java Język programowania

Remote Method Invocation 17 listopada 2010

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Abstract Factory (fabryka abstrakcyjna)

1. Co można powiedzieć o poniższym kodzie?

Czym jest polimorfizm?

Platformy Programistyczne Podstawy języka Java

Programowanie obiektowe

Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników

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


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

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Kurs WWW. Paweł Rajba.

Transkrypt:

Polimorfizm

Przykład - http://rpodhajny.wordpress.com klasa bazowa A, oraz klasy pochodne B1, B2,, Bn (dziedziczące po klasie bazowej). niektóre klasy pochodne chcą mieć możliwość skorzystania z metody xxx() niewszytskie klasy Zadeklarowanie metody xxx() w klasie bazowej, spowoduje, że wszystkie klasy pochodne wejdą w jej posiadanie. Nowa klasa z metodą xxx(), dziedziczą z niej tylko te klasy, które chcą mieć dostęp do xxx() wielodziedziczenie

Interfejs?? interfejs X, który posiada deklarację metody xxx() każda klasa implementująca ten interfejs będzie musiała zaimplementować abstrakcyjną metodę, jaką on udostępnia.

class A { void a(){; class B1 extends A { // B1 dziedziczy metodę a() z klasy bazowej class B2 extends A implements X { // B2 dziedziczy metodę a() z klasy bazowej public void interfacemethod() { //... interface X { void interfacemethod(); public class Main { public static void main( String[] args ) { B1 b1 = new B1(); b1.a(); B2 b2 = new B2(); b2.a(); b2.interfacemethod(); // dzięki implementacji interfejsu, obiekt b2 zyskał nowe możliwości

obiekt b2 jest jednocześnie obiektem klasy B2 klasy A dziedziczenie Interfejsu X implementuje ten interfejs klasy Object wszystkie klasy w Javie wywodzą się z klasy Object

polimorfizm Obiekt b2 może być traktowany (w zależności od potrzeby) jako obiekt klasy: B2, A, X Object.

instanceof potrzeba zebrania w jednym miejscu wszystkich obiektów typu A, operator instanceof zwraca true, jeżeli obiekt po lewej stronie nalezy do klasy po prawej jego stronie. object instanceof type

Przykład - http://www.java-samples.com class A { int i, j; class B { int i, j; class C extends A { int k; class D extends A { int k; class InstanceOf { public static void main(string args[]) { A a = new A(); B b = new B(); C c = new C(); D d = new D();

if(a instanceof A) System.out.println("a is instance of A"); if(b instanceof B) System.out.println("b is instance of B"); if(c instanceof C) System.out.println("c is instance of C"); if(c instanceof A) System.out.println("c can be cast to A"); if(a instanceof C) System.out.println("a can be cast to C"); System.out.println(); a is instance of A b is instance of B c is instance of C c can be cast to A

D d = new D(); A ob; ob = d; // A reference to d System.out.println("ob now refers to d"); if(ob instanceof D) System.out.println("ob is instance of D"); System.out.println(); ob now refers to d ob is instance of D ob = c; // A reference to c System.out.println("ob now refers to c"); if(ob instanceof D) System.out.println("ob can be cast to D"); else System.out.println("ob cannot be cast to D"); if(ob instanceof A) System.out.println("ob can be cast to A"); ob now refers to c ob cannot be cast to D ob can be cast to A

if(a instanceof Object) System.out.println("a may be cast to Object"); if(b instanceof Object) System.out.println("b may be cast to Object"); if(c instanceof Object) System.out.println("c may be cast to Object"); if(d instanceof Object) System.out.println("d may be cast to Object"); a may be cast to Object b may be cast to Object c may be cast to Object d may be cast to Object

Przykład rzutowanie w górę 'Thinking in Java, 3rd ed.' (c) Bruce Eckel 2002 //: c07:music:note.java - Nuty grane na instrumentach muzycznych. package c07.music; import com.bruceeckel.simpletest.*; public class Note { private String notename; private Note(String notename) { this.notename = notename; public String tostring() { return notename; stałe obiekty, które możemy używać, ale nie tworzyć public static final Note MIDDLE_C = new Note("Środkowe C"), C_SHARP = new Note("C wysokie"), B_FLAT = new Note("B z bemolem");

package c07.music; public class Instrument { public void play(note n) { System.out.println("Instrument.play() " + n); package c07.music; // Obiekty Wind są instrumentami (Instrument) gdyż mają ten sam interfejs public class Wind extends Instrument { public void play(note n) { System.out.println("Wind.play() " + n);

// Dziedziczenie i rzutowanie w górę. package c07.music; import com.bruceeckel.simpletest.*; public class Music { public static void tune(instrument i) { //... i.play(note.middle_c); public static void main(string[] args) { Wind flute = new Wind(); tune(flute); // Rzutowanie w górę Wind staje się Instrument... ///:~ "Wind.play() Środkowe C"

package c07.music; import com.bruceeckel.simpletest.*; przeciążenie class Stringed extends Instrument { public void play(note n) { System.out.println("Stringed.play() " + n); class Brass extends Instrument { public void play(note n) { System.out.println("Brass.play() " + n);

public class Music2 { public static void tune(wind i) { i.play(note.middle_c); public static void tune(stringed i) { i.play(note.middle_c); public static void tune(brass i) { i.play(note.middle_c); public static void main(string[] args) { Wind flute = new Wind(); Stringed violin = new Stringed(); Brass frenchhorn = new Brass(); tune(flute); // Brak rzutowania w górę tune(violin); tune(frenchhorn); ///: Wind.play() Środkowe C Stringed.play() Środkowe C Brass.play() Środkowe C

Przygotowanie jednej metody pobierającej obiekt klasy bazowej? Wiązanie: wczesne na etapie kompilacji późne na etapie wykonywania programu public static void tune(instrument i) { //... i.play(note.middle_c);

Rzutowanie w górę: Shape s=new Circle(); s.draw(); draw() z Shape draw() z Circle

class Shape { void draw() { void erase() { class Circle extends Shape { void draw() { System.out.println("Circle.draw()"); void erase() { System.out.println("Circle.erase()"); class Square extends Shape { void draw() { System.out.println("Square.draw()"); void erase() { System.out.println("Square.erase()"); class Triangle extends Shape { void draw() { System.out.println("Triangle.draw()"); void erase() { System.out.println("Triangle.erase()");

// "Fabryka", która w losowy sposób tworzy figury: class RandomShapeGenerator { private Random rand = new Random(); public Shape next() { switch(rand.nextint(3)) { default: Rzutowanie w górę case 0: return new Circle(); case 1: return new Square(); case 2: return new Triangle(); public class Shapes { private static RandomShapeGenerator gen =new RandomShapeGenerator(); public static void main(string[] args) { Shape[] s = new Shape[9]; for(int i = 0; i < s.length; i++) // Wypełnienie tablicy figurami s[i] = gen.next(); for(int i = 0; i < s.length; i++) //Polimorficzne wywołania metody s[i].draw();