Et unum hominem, et plures in infinitum, quod quis velit, heredes facere licet - wolno uczynić spadkobiercą i jednego człowieka, i wielu, bez ograniczeń, ilu kto chce.

[ Pobierz całość w formacie PDF ]

interface Przekaznik {
void wykonajZestawInstrukcji(String instrukcje);
}
2.4.2. Implementacje
Jak wcześniej wspominałem, sam interfejs z punktu widzenia metod jest tylko dekla-
racją ich wystąpienia. Samo ciało metody musi zostać zaimplementowane w innym
miejscu. Wspominałem również, że sam interfejs nie może być miejscem tej imple-
mentacji. Podobnie jak wirus musi się on  dokleić do klasy, aby był w pełni funk-
cjonalny. Takie doklejanie odbywa się z użyciem słowa kluczowego implements. Po
dodaniu tego fragmentu mogę wreszcie na listingu 2.56 zaprezentować pełny format
nagłówka definicji klasy.
Listing 2.56. Pełny format nagłówka klasy
class Nazwa [extends NazwaNadklasy]
[implements Interfejs1 [, Interfejs2 [...]]]
{
public typ metoda_z_interfejsu([parametry]) {
Rozdział 2. f& Klasy i obiekty w Javie 75
ciaco_implementowanej_metody
}
// część główna klasy
// według wcześniejszego schematu
}
Już wskazuje pobieżna analiza nagłówka, klasa może implementować większą liczbę
interfejsów. W części głównej klasy musi znalezć się deklaracja i implementacja me-
tody, której istnienie jest zadeklarowane w interfejsie (z wyjątkiem przypadku, kiedy
klasę deklarujemy jako abstrakcyjną). Należy pamiętać, że do ciała klasy należy dodać
metody zadeklarowane w implementowanych interfejsach. Metody te muszą być de-
klarowane z modyfikatorem public. Przykładowa implementacja interfejsu przekaznik
zadeklarowanego wcześniej z użyciem klasy UrzadzenieZdalnieSterowane będzie miała
postać pokazaną na listingu 2.57.
Listing 2.57. Przykładowa implementacja interfejsu
class UrzadzenieZdalnieSterowane
extends Urzadzenie implements Przekaznik {
private int dekodujRozkaz(String instrukcje, int polozenie) {
// tu dekodowanie instrukcji
// o numerze polozenie na Rozkaz typu int
}
private int dekodujParametr(String instrukcje, int polozenie) {
// tu dekodowanie parametru o numerze polozenie
// z ciągu tekstowego na typ int
}
private void wykonajRozkaz(int rozkaz, int parametr) {
// tu wykonanie instrukcji rozkaz
// z parametrem parametr
}
public void WykonajpestawInstrukcji(String instrukcjep b
int n = 0;
int r, p;
r = dekodujRozkaz(instrukcje, np;
p = dekodujParametr(instrukcje, np;
while (r>0p b
wykonajRozkaz(r, pp;
n++;
r = dekodujRozkaz(instrukcje, np;
p = dekodujParametr(instrukcje, np;
}
}
}
Na listingu 2.57 wytłuszczona została metoda wykonajZestawInstrukcji pochodząca
z interfejsu Przekaznik. Można też zauważyć, że poza dekodujRozkaz, dekodujParametr
i wykonajRozkaz klasa nie zawiera żadnych innych metod charakterystycznych dla
samej klasy UrzadzenieZdalnieSterowane.
76 Java. Programowanie obiektowe
Stosując interfejsy, należy pamiętać o mogącym pojawić się problemie wynikającym
z konfliktu nazw metod. Jakkolwiek Java umożliwia przeciążanie metod, może się
zdarzyć, że interfejsy implementowane w danej klasie dostarczają metody o tej samej
nazwie, tym samym zestawie parametrów i różnym wyniku. Kompilator nie jest w stanie
obsłużyć takiego przeciążenia metod, więc generuje błąd semantyki języka. Problem
ten szerzej opisałem w paragrafie 2.4.6.  Dziedziczenie interfejsów .
2.4.3. Zastosowanie interfejsów
Wyobrazmy sobie, że tworzymy oprogramowanie do zarządzania inteligentnym bu-
dynkiem. Inwestor zakupił do tego budynku bardzo wymyślne urządzenie klimatyza-
cyjne, do którego dołączony był sterownik obsługi napisany w Javie. Oczywiście
zgodnie z konwencją języka jest to w pełni funkcjonalna klasa, która udostępnia pro-
gramiście metody ustawTemperature, ustawWilgotnosc i ustawSileNadmuchu. Klasa ta
jest w pełni funkcjonalna, to znaczy możemy użytkownikowi naszego programu udo-
stępnić korzystanie z każdej funkcji klimatyzatora, ale tylko w sposób manualny, to
znaczy może on zmieniać tylko jeden parametr w danym momencie i nie może zażą-
dać, aby na przykład temperatura zmieniła się, ale dopiero za godzinę. Nie ma się co
dziwić, w końcu jest to tylko sterownik do fizycznego urządzenia. Pełną funkcjonal-
ność można uzyskać dopiero po wprowadzeniu własnego, bardziej zaawansowanego
programu. Moglibyśmy oczywiście utworzyć nową klasę dziedziczącą własności po
klasie sterownika klimatyzacji i w jej rozszerzeniu zamieścić nowe metody, które
umożliwiłyby stworzenie programatora zmian. Nie jesteśmy jednak początkującymi
programistami. Poprzednio wykonywaliśmy bardzo podobną pracę dla małej lokalnej [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • jutuu.keep.pl
  • Menu

    Cytat


    Fallite fallentes - okłamujcie kłamiących. Owidiusz
    Diligentia comparat divitias - pilność zestawia bogactwa. Cyceron
    Daj mi właściwe słowo i odpowiedni akcent, a poruszę świat. Joseph Conrad
    I brak precedensu jest precedensem. Stanisław Jerzy Lec (pierw. de Tusch - Letz, 1909-1966)
    Ex ante - z przed; zanim; oparte na wcześniejszych założeniach.