Autorzy: Łukasz Dobrzyński Artur Szaturski
description
Transcript of Autorzy: Łukasz Dobrzyński Artur Szaturski
Realizacja ekstensji klasy w Realizacja ekstensji klasy w oparciu o tablicę statyczną i oparciu o tablicę statyczną i
kolekcję na przykładzie kolekcję na przykładzie metod klasowych, metod metod klasowych, metod
objektu i polimorfizm metodobjektu i polimorfizm metod
Autorzy:Autorzy:
Łukasz DobrzyńskiŁukasz Dobrzyński
Artur SzaturskiArtur Szaturski
Ekstensja klasyEkstensja klasy
Ekstensja(class extent) = aktualny (zmienny w czasie) Ekstensja(class extent) = aktualny (zmienny w czasie) zestaw wszystkich wystąpień tej klasy. Ekstensja zestaw wszystkich wystąpień tej klasy. Ekstensja klasy w implementacji oznacza specjalną strukturę klasy w implementacji oznacza specjalną strukturę danych, konkretny byt programistyczny dołączony danych, konkretny byt programistyczny dołączony do klasy. Ta struktura stanowi skład obiektów, do klasy. Ta struktura stanowi skład obiektów, przechowując wszystkie obiekty będące członkami przechowując wszystkie obiekty będące członkami danej klasy.danej klasy.
Klasa może mieć nie jedną lecz wiele ekstansji.Klasa może mieć nie jedną lecz wiele ekstansji.
Ekstensja klasy; przykładEkstensja klasy; przykład
OSOBANAZWISKO=NowackiROK_UR=1940
OSOBANAZWISKO=AbackiROK_UR=1948
OSOBANAZWISKO=NowakROK_UR=1951
NAZWISKOROK_URWiek()
PRACOWNIKZAROBEKDZIAŁZarobekNetto()ZmieńZarobek(...)
NAZWISKO=KowalskaROK_UR=1975
NAZWISKO=AbackiROK_UR=1948ZAROBEK=2500DZIAŁ=zabawki
NAZWISKO=NowackiROK_UR=1940ZAROBEK=3000DZIAŁ=sprzedaż
Ekstensja klasyOSOBA
Ekstensja klasyPRACOWNIK
OSOBA
:OSOBA
:PRACOWNIK :PRACOWNIKNAZWISKO=NowakROK_UR=1951ZAROBEK=2000DZIAŁ=zabawki
:PRACOWNIK
Ekstansja klasy w oparciu o tablice dynamicznepublic class TablicaDynamiczna {public class TablicaDynamiczna {
public static void main(String[] args) {public static void main(String[] args) {Ludzie ludzie1 = new Ludzie("Piotr", "Staroszczyk", 15);Ludzie ludzie1 = new Ludzie("Piotr", "Staroszczyk", 15);Ludzie ludzie2 = new Ludzie("Marcin", "Gajos", 22);Ludzie ludzie2 = new Ludzie("Marcin", "Gajos", 22);Ludzie ludzie3 = new Ludzie("Sedzia", "Dred", 33);Ludzie ludzie3 = new Ludzie("Sedzia", "Dred", 33);Ludzie ludzie4 = new Ludzie("Che", "Pper", 20);Ludzie ludzie4 = new Ludzie("Che", "Pper", 20);Ludzie ludzie5 = new Ludzie("Endriu", "Leppa", 10);Ludzie ludzie5 = new Ludzie("Endriu", "Leppa", 10);Ludzie ludzie6 = new Ludzie("Jan", "Nowak", 50);Ludzie ludzie6 = new Ludzie("Jan", "Nowak", 50);Ludzie.liczbaLudzi();Ludzie.liczbaLudzi(); ludzie3.podajWiek(); ludzie3.podajWiek(); Ludzie.podajNajstarszaOsobe(); Ludzie.podajNajstarszaOsobe();
}}}}class Osoba {class Osoba {
String imie, nazwisko;String imie, nazwisko;int wiek;int wiek;Osoba (String imie, String nazwisko, int wiek) {Osoba (String imie, String nazwisko, int wiek) {
this.imie = imie;this.imie = imie;this.nazwisko = nazwisko;this.nazwisko = nazwisko;this.wiek = wiek;this.wiek = wiek;
}}public String toString() {public String toString() {
return "imie: " + this.imie + ", nazwisko: " + this.nazwisko + ", wiek: " + this.wiek;return "imie: " + this.imie + ", nazwisko: " + this.nazwisko + ", wiek: " + this.wiek;}}
}}
class Ludzie {class Ludzie {static Ludzie ekstensja[] = new Ludzie[0];static Ludzie ekstensja[] = new Ludzie[0];static int liczbaObiektow;static int liczbaObiektow;Osoba osoba;Osoba osoba;Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) {Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) {
this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek);this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek);liczbaObiektow++;liczbaObiektow++;Ludzie newEkstensja[] = new Ludzie[liczbaObiektow];Ludzie newEkstensja[] = new Ludzie[liczbaObiektow];for (int i=0; i<ekstensja.length; i++) {for (int i=0; i<ekstensja.length; i++) {
newEkstensja[i] = ekstensja[i];newEkstensja[i] = ekstensja[i];}}newEkstensja[liczbaObiektow-1] = this;newEkstensja[liczbaObiektow-1] = this;ekstensja = newEkstensja;ekstensja = newEkstensja;newEkstensja = null;newEkstensja = null;System.out.println("nowy obiekt zostal dodany do tablicy {" + this.osoba + "}");System.out.println("nowy obiekt zostal dodany do tablicy {" + this.osoba + "}");System.out.println("Liczba obiektow: " + liczbaObiektow);System.out.println("Liczba obiektow: " + liczbaObiektow);
}}static void liczbaLudzi() {static void liczbaLudzi() {
System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby");System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby");}}void podajWiek() {void podajWiek() {
System.out.println("Wiek osoby = " + this.osoba.wiek + " lata");System.out.println("Wiek osoby = " + this.osoba.wiek + " lata");}}static void podajNajstarszaOsobe() {static void podajNajstarszaOsobe() {
int wiek = 0;int wiek = 0;System.out.println(ekstensja.length);System.out.println(ekstensja.length);for (int i=0; i<ekstensja.length; i++) {for (int i=0; i<ekstensja.length; i++) {
//System.out.print(i + " ");//System.out.print(i + " ");if (ekstensja[i].osoba.wiek > wiek) { if (ekstensja[i].osoba.wiek > wiek) {
wiek = ekstensja[i].osoba.wiek; wiek = ekstensja[i].osoba.wiek; }}
}}System.out.println("Najstarszy pipol ma " + wiek + " lat");System.out.println("Najstarszy pipol ma " + wiek + " lat");
}}}}
Ekstansja klasy w oparciu o tablice statyczne
• Tablica jest najbardziej wydajnym sposobem zapisu i swobodnego dostępu do ciągu przechowywanych obiektów. Ale posiada także duże wady:
• Gdy tworzymy tablicę musimy znać jej rozmiar, którego później nie można zmieniać!
• Obiekt jednej tablicy może przechowywać obiekty tylko jednego, określonego typu.
• Trzeba także pamiętać, że wszystkie metody działające na tej ekstensji muszą być statyczne.
KodKod
– public class TablicaStatyczna {public class TablicaStatyczna {– public static void main(String[] args) {public static void main(String[] args) {– Ludzie ludzie1 = new Ludzie("Piotr", "Staroszczyk", 15);Ludzie ludzie1 = new Ludzie("Piotr", "Staroszczyk", 15);– Ludzie ludzie2 = new Ludzie("Marcin", "Gajos", 22);Ludzie ludzie2 = new Ludzie("Marcin", "Gajos", 22);– Ludzie ludzie3 = new Ludzie("Sedzia", "Dred", 33);Ludzie ludzie3 = new Ludzie("Sedzia", "Dred", 33);– Ludzie.liczbaLudzi();Ludzie.liczbaLudzi(); – ludzie3.podajWiek(); ludzie3.podajWiek(); – Ludzie.podajNajstarszaOsobe(); Ludzie.podajNajstarszaOsobe(); – }}– }}– class Osoba {class Osoba {– String imie, nazwisko;String imie, nazwisko;– int wiek;int wiek;– Osoba () {Osoba () {– }}– Osoba (String imie, String nazwisko, int wiek) {Osoba (String imie, String nazwisko, int wiek) {– this.imie = imie;this.imie = imie;– this.nazwisko = nazwisko;this.nazwisko = nazwisko;– this.wiek = wiek;this.wiek = wiek;– }}– }}
– class Ludzie {class Ludzie {– static Ludzie ekstensja[] = new Ludzie[100];static Ludzie ekstensja[] = new Ludzie[100];– static int liczbaObiektow;static int liczbaObiektow;– Osoba osoba;Osoba osoba;– Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) {Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) {– this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek);this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek);– ekstensja[liczbaObiektow] = this;ekstensja[liczbaObiektow] = this;– liczbaObiektow++;liczbaObiektow++;– System.out.println("nowy obiekt zostal dodany do tablicy");System.out.println("nowy obiekt zostal dodany do tablicy");
– }}– static void liczbaLudzi() {static void liczbaLudzi() {– System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby");System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby");– }}– void podajWiek() {void podajWiek() {– System.out.println("Wiek osoby = " + this.osoba.wiek + " lata");System.out.println("Wiek osoby = " + this.osoba.wiek + " lata");– }}– static void podajNajstarszaOsobe() {static void podajNajstarszaOsobe() {– int wiek = 0;int wiek = 0;– for (int i=0; i<liczbaObiektow; i++) {for (int i=0; i<liczbaObiektow; i++) {– if (ekstensja[i].osoba.wiek > wiek) { if (ekstensja[i].osoba.wiek > wiek) { – wiek = ekstensja[i].osoba.wiek; wiek = ekstensja[i].osoba.wiek; – }}– }}– System.out.println("Najstarszy pipol ma " + wiek + " lat");System.out.println("Najstarszy pipol ma " + wiek + " lat");– }}– }}
Ekstansja klasy w oparciu o kolekcje
• Kolekcja jest strukturą danych służącą do przechowywania danych i wykonywania na nich operacji. W odróżnieniu od tablicy, struktura to Klasa, która posiada zdefiniowane metody umożliwiające takie operacje jak dodawanie, usuwanie i przeglądnie (iteracja) elementów, które się w niej znajdują.
• Przykładowe kolekcje w Javie to: Vector, Stack, HashSet, HashTable, TreeSet, ArrayList, LinkedList, HashMap, TreeMap.
KodKodclass Osoba {class Osoba { String imie, nazwisko;String imie, nazwisko; int wiek;int wiek; Osoba (String imie, String nazwisko, int wiek) {Osoba (String imie, String nazwisko, int wiek) { this.imie = imie;this.imie = imie; this.nazwisko = nazwisko;this.nazwisko = nazwisko; this.wiek = wiek;this.wiek = wiek; }} public String toString() {public String toString() { return "imie: " + this.imie + ", nazwisko: " + this.nazwisko + ", wiek: " + this.wiek;return "imie: " + this.imie + ", nazwisko: " + this.nazwisko + ", wiek: " + this.wiek; }}}}class Ludzie {class Ludzie { static Vector ekstensja = new Vector();static Vector ekstensja = new Vector(); static int liczbaObiektow;static int liczbaObiektow; Osoba osoba;Osoba osoba; Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) {Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) { this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek);this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek); ekstensja.add(this);ekstensja.add(this); liczbaObiektow++; liczbaObiektow++; System.out.println("nowy obiekt zostal dodany do kolekcji {" + this.osoba + "}");System.out.println("nowy obiekt zostal dodany do kolekcji {" + this.osoba + "}"); System.out.println("Liczba obiektow: " + liczbaObiektow);System.out.println("Liczba obiektow: " + liczbaObiektow); }} static void liczbaLudzi() {static void liczbaLudzi() { System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby");System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby"); }} void podajWiek() {void podajWiek() { System.out.println("Wiek osoby = " + this.osoba.wiek + " lata"); System.out.println("Wiek osoby = " + this.osoba.wiek + " lata"); } }
static void podajNajstarszaOsobe() {static void podajNajstarszaOsobe() {
int wiek = 0;int wiek = 0;
int wiek2 = 0;int wiek2 = 0;
Iterator i = ekstensja.iterator();Iterator i = ekstensja.iterator();
while (i.hasNext()) {while (i.hasNext()) {
wiek2 = ((Ludzie)i.next()).osoba.wiek;wiek2 = ((Ludzie)i.next()).osoba.wiek;
if (wiek2 > wiek) { if (wiek2 > wiek) {
wiek = wiek2; wiek = wiek2;
}}
}}
System.out.println("Najstarszy pipol ma " + wiek + " lat");System.out.println("Najstarszy pipol ma " + wiek + " lat");
}}
}}
Rodzaje metodRodzaje metod
Metody mogą być:Metody mogą być:
- - abstrakcyjneabstrakcyjne
- - obiektu:obiektu: policz wiek, czy pracował w (nazwa policz wiek, czy pracował w (nazwa firmy)firmy)
- - klasowe:klasowe: policz wiek (imię, nazwisko), znajdź policz wiek (imię, nazwisko), znajdź najstarszegonajstarszego
Metoda objektuMetoda objektu - operuje na - operuje na atrybutach atrybutach jednego obiektu jednego obiektu – tego dla – tego dla którego została którego została wywołana. wywołana.
Obiekt jest argumentem Obiekt jest argumentem domyślnym metodydomyślnym metody
Metoda klasowaMetoda klasowa - - operuje na ekstensji operuje na ekstensji klasy, czyli posiada klasy, czyli posiada
dostęp do dostęp do atrybutów atrybutów wszystkich obiektów wszystkich obiektów członków członków danej klasy.danej klasy.
Polimorfizm metodPolimorfizm metod
Polega na tym, że operacja wywołana Polega na tym, że operacja wywołana za pośrednictwem komunikatu może za pośrednictwem komunikatu może być różnie wykonana, w zależności być różnie wykonana, w zależności od rodzaju obiektu, do którego ten od rodzaju obiektu, do którego ten komunikat został wysłany; innymi komunikat został wysłany; innymi słowy – może istnieć wiele metod słowy – może istnieć wiele metod implementujących daną operację. implementujących daną operację.
KodKod
Obsługa ekstensji klasy Obsługa ekstensji klasy używając klasy pomocniczejużywając klasy pomocniczej
Polega na tym, że tworzeniem Polega na tym, że tworzeniem obiektów i zarządzaniem nimi obiektów i zarządzaniem nimi zajmuje się klasa pomocnicza - zajmuje się klasa pomocnicza - kontener.kontener.
Klasa pomocnicza posiada metody, Klasa pomocnicza posiada metody, które pozwalają na dodawanie i które pozwalają na dodawanie i usuwanie obiektów innej klasy. usuwanie obiektów innej klasy.
Wady i zalety obsługi ekstensji Wady i zalety obsługi ekstensji klasy za pomocą klasy klasy za pomocą klasy
pomocniczejpomocniczejWielką zaletą takiego sposobu obsługi Wielką zaletą takiego sposobu obsługi
ekstensji jest to, że programista posiada ekstensji jest to, że programista posiada kontrole nad tworzeniem i usuwaniem kontrole nad tworzeniem i usuwaniem obiektów. Ponadto takie klasy mają dużą obiektów. Ponadto takie klasy mają dużą funkcjonalność, w przykładzie jest tylko funkcjonalność, w przykładzie jest tylko kilka podstawowych funkcji takich jak kilka podstawowych funkcji takich jak zliczanie elementów ekstensji,ale można zliczanie elementów ekstensji,ale można rozszerzyć o bardziej skomplikowane i rozszerzyć o bardziej skomplikowane i równie pożyteczne metody (np.sortowanie)równie pożyteczne metody (np.sortowanie)