170 likes | 354 Views
Realizacja ekstensji klasy w oparciu o tablicę statyczną i kolekcję na przykładzie metod klasowych, metod objektu i polimorfizm metod. Autorzy: Łukasz Dobrzyński Artur Szaturski. Ekstensja klasy.
E N D
Realizacja ekstensji klasy w oparciu o tablicę statyczną i kolekcję na przykładzie metod klasowych, metod objektu i polimorfizm metod Autorzy: Łukasz Dobrzyński Artur Szaturski
Ekstensja klasy Ekstensja(class extent) = aktualny (zmienny w czasie) zestaw wszystkich wystąpień tej klasy. Ekstensja klasy w implementacji oznacza specjalną strukturę danych, konkretny byt programistyczny dołączony do klasy. Ta struktura stanowi skład obiektów, przechowując wszystkie obiekty będące członkami danej klasy. Klasa może mieć nie jedną lecz wiele ekstansji.
Ekstensja klasy; przykład NAZWISKO ROK_UR Wiek() PRACOWNIK ZAROBEK DZIAŁ ZarobekNetto() ZmieńZarobek(...) NAZWISKO=Nowak ROK_UR=1951 ZAROBEK=2000 DZIAŁ=zabawki :PRACOWNIK OSOBA Ekstensja klasy OSOBA :OSOBA NAZWISKO=Kowalska ROK_UR=1975 OSOBA NAZWISKO=Nowak ROK_UR=1951 OSOBA NAZWISKO=Abacki ROK_UR=1948 OSOBA NAZWISKO=Nowacki ROK_UR=1940 Ekstensja klasy PRACOWNIK :PRACOWNIK NAZWISKO=Abacki ROK_UR=1948 ZAROBEK=2500 DZIAŁ=zabawki :PRACOWNIK NAZWISKO=Nowacki ROK_UR=1940 ZAROBEK=3000 DZIAŁ=sprzedaż
Ekstansja klasy w oparciu o tablice dynamiczne public class TablicaDynamiczna { public static void main(String[] args) { Ludzie ludzie1 = new Ludzie("Piotr", "Staroszczyk", 15); Ludzie ludzie2 = new Ludzie("Marcin", "Gajos", 22); Ludzie ludzie3 = new Ludzie("Sedzia", "Dred", 33); Ludzie ludzie4 = new Ludzie("Che", "Pper", 20); Ludzie ludzie5 = new Ludzie("Endriu", "Leppa", 10); Ludzie ludzie6 = new Ludzie("Jan", "Nowak", 50); Ludzie.liczbaLudzi(); ludzie3.podajWiek(); Ludzie.podajNajstarszaOsobe(); } } class Osoba { String imie, nazwisko; int wiek; Osoba (String imie, String nazwisko, int wiek) { this.imie = imie; this.nazwisko = nazwisko; this.wiek = wiek; } public String toString() { return "imie: " + this.imie + ", nazwisko: " + this.nazwisko + ", wiek: " + this.wiek; } }
class Ludzie { static Ludzie ekstensja[] = new Ludzie[0]; static int liczbaObiektow; Osoba osoba; Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) { this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek); liczbaObiektow++; Ludzie newEkstensja[] = new Ludzie[liczbaObiektow]; for (int i=0; i<ekstensja.length; i++) { newEkstensja[i] = ekstensja[i]; } newEkstensja[liczbaObiektow-1] = this; ekstensja = newEkstensja; newEkstensja = null; System.out.println("nowy obiekt zostal dodany do tablicy {" + this.osoba + "}"); System.out.println("Liczba obiektow: " + liczbaObiektow); } static void liczbaLudzi() { System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby"); } void podajWiek() { System.out.println("Wiek osoby = " + this.osoba.wiek + " lata"); } static void podajNajstarszaOsobe() { int wiek = 0; System.out.println(ekstensja.length); for (int i=0; i<ekstensja.length; i++) { //System.out.print(i + " "); if (ekstensja[i].osoba.wiek > wiek) { wiek = ekstensja[i].osoba.wiek; } } 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.
Kod • public class TablicaStatyczna { • public static void main(String[] args) { • Ludzie ludzie1 = new Ludzie("Piotr", "Staroszczyk", 15); • Ludzie ludzie2 = new Ludzie("Marcin", "Gajos", 22); • Ludzie ludzie3 = new Ludzie("Sedzia", "Dred", 33); • Ludzie.liczbaLudzi(); • ludzie3.podajWiek(); • Ludzie.podajNajstarszaOsobe(); • } • } • class Osoba { • String imie, nazwisko; • int wiek; • Osoba () { • } • Osoba (String imie, String nazwisko, int wiek) { • this.imie = imie; • this.nazwisko = nazwisko; • this.wiek = wiek; • } • }
class Ludzie { • static Ludzie ekstensja[] = new Ludzie[100]; • static int liczbaObiektow; • Osoba osoba; • Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) { • this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek); • ekstensja[liczbaObiektow] = this; • liczbaObiektow++; • System.out.println("nowy obiekt zostal dodany do tablicy"); • } • static void liczbaLudzi() { • System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby"); • } • void podajWiek() { • System.out.println("Wiek osoby = " + this.osoba.wiek + " lata"); • } • static void podajNajstarszaOsobe() { • int wiek = 0; • for (int i=0; i<liczbaObiektow; i++) { • if (ekstensja[i].osoba.wiek > wiek) { • wiek = ekstensja[i].osoba.wiek; • } • } • 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.
Kod class Osoba { String imie, nazwisko; int wiek; Osoba (String imie, String nazwisko, int wiek) { this.imie = imie; this.nazwisko = nazwisko; this.wiek = wiek; } public String toString() { return "imie: " + this.imie + ", nazwisko: " + this.nazwisko + ", wiek: " + this.wiek; } } class Ludzie { static Vector ekstensja = new Vector(); static int liczbaObiektow; Osoba osoba; Ludzie (String osobaImie, String osobaNazwisko, int osobaWiek) { this.osoba = new Osoba(osobaImie, osobaNazwisko, osobaWiek); ekstensja.add(this); liczbaObiektow++; System.out.println("nowy obiekt zostal dodany do kolekcji {" + this.osoba + "}"); System.out.println("Liczba obiektow: " + liczbaObiektow); } static void liczbaLudzi() { System.out.println("w systemie znajduje sie " + liczbaObiektow + " osoby"); } void podajWiek() { System.out.println("Wiek osoby = " + this.osoba.wiek + " lata"); }
static void podajNajstarszaOsobe() { int wiek = 0; int wiek2 = 0; Iterator i = ekstensja.iterator(); while (i.hasNext()) { wiek2 = ((Ludzie)i.next()).osoba.wiek; if (wiek2 > wiek) { wiek = wiek2; } } System.out.println("Najstarszy pipol ma " + wiek + " lat"); } }
Rodzaje metod Metody mogą być: - abstrakcyjne - obiektu: policz wiek, czy pracował w (nazwa firmy) - klasowe: policz wiek (imię, nazwisko), znajdź najstarszego
Metoda objektu - operuje na atrybutach jednego obiektu – tego dla którego została wywołana. Obiekt jest argumentem domyślnym metody Metoda klasowa - operuje na ekstensji klasy, czyli posiada dostęp do atrybutów wszystkich obiektów członków danej klasy.
Polimorfizm metod Polega na tym, że operacja wywołana za pośrednictwem komunikatu może być różnie wykonana, w zależności od rodzaju obiektu, do którego ten komunikat został wysłany; innymi słowy – może istnieć wiele metod implementujących daną operację.
Obsługa ekstensji klasy używając klasy pomocniczej Polega na tym, że tworzeniem obiektów i zarządzaniem nimi zajmuje się klasa pomocnicza - kontener. Klasa pomocnicza posiada metody, które pozwalają na dodawanie i usuwanie obiektów innej klasy.
Wady i zalety obsługi ekstensji klasy za pomocą klasy pomocniczej Wielką zaletą takiego sposobu obsługi ekstensji jest to, że programista posiada kontrole nad tworzeniem i usuwaniem obiektów. Ponadto takie klasy mają dużą funkcjonalność, w przykładzie jest tylko kilka podstawowych funkcji takich jak zliczanie elementów ekstensji,ale można rozszerzyć o bardziej skomplikowane i równie pożyteczne metody (np.sortowanie)