background image

Programowanie obiektowe 

L

L

a

a

b

b

o

o

r

r

a

a

t

t

o

o

r

r

i

i

u

u

m

m

 

 

z

z

 

 

p

p

r

r

z

z

e

e

d

d

m

m

i

i

o

o

t

t

u

u

 

 

P

P

r

r

o

o

g

g

r

r

a

a

m

m

o

o

w

w

a

a

n

n

i

i

e

e

 

 

o

o

b

b

i

i

e

e

k

k

t

t

o

o

w

w

e

e

 

 

-

-

 

 

z

z

e

e

s

s

t

t

a

a

w

w

 

 

0

0

3

3

 

 

Cel  zajęć.  Celem  zajęć  jest  zapoznanie  z praktycznymi  aspektami  projektowania  oraz  implementacji  klas 
abstrakcyjnych i interfejsów. 

Wprowadzenie teoretyczne. Rozważana w ramach niniejszych zajęć tematyka jest ważna, gdyż klasy abstrakcyjne 
i interfejsy są powszechnie wykorzystywane przy okazji stosowania mechanizmu dziedziczenia. Aby ze zrozumieniem 

zrealizować zadania, przewidziane do wykonania w ramach zajęć laboratoryjnych, należy znać znaczenie pojęć takich 
jak: klasa abstrakcyjna, metoda abstrakcyjna, interfejs. Należy również znać podstawy języka modelowania systemów 
informatycznych UML. 

1.  Klasy i metody abstrakcyjne 

 

Klasa  abstrakcyjna  to  klasa,  która  nie  posiada  swoich  reprezentantów  pod  postacią  obiektów.  Jest  ona 
wykorzystywana  wyłącznie  w roli  klasy  bazowej  dla  innych  klas.  Klasa  potomna  względem  klasy 
abstrakcyjnej  musi  implementować  jej  wszystkie  abstrakcyjne  metody  i właściwości.  Klasa  abstrakcyjna 

może  zawierać  także  pola  oraz  metody  i właściwości,  które  nie  są  abstrakcyjne.  Klasa,  która  zawiera 
abstrakcyjną  właściwość  lub  metodę,  również  musi  być  abstrakcyjna.  Klasa  abstrakcyjna  jest  oznaczona 
modyfikatorem „abstract”. 
 

Metoda  abstrakcyjna  jest  metodą  oznaczoną  modyfikatorem  „abstract”.  Posiada  ona  jedynie  deklarację 
w klasie  abstrakcyjnej.  Definicja  metody  znajduje  się  w klasach  potomnych,  dziedziczących  po  klasie 
abstrakcyjnej. Metody abstrakcyjne nie mogą być prywatne. 
 

Mechanizm dziedziczenia po klasie abstrakcyjnej przedstawia poniższy przykład: 
 
Przykład 1 – Dziedziczenie klasy abstrakcyjnej 

 
 

 

 

background image

Programowanie obiektowe 

 

 

 

 

 
 

 
 
Proszę zwrócić uwagę na to, że metody klas potomnych, które implementują metody abstrakcyjne klasy 
bazowej, posiadają modyfikator „override”.  

2.  Interfejsy 

Interfejs  jest  abstrakcyjną  reprezentacją  klasy,  która  deklaruje  swoje  składowe,  ale  ich  nie  implementuje. 
Tworzenie  obiektów  interfejsu  nie  jest  możliwe.  Klasy  dziedziczące  po  interfejsie  muszą  implementować 
wszystkie  jego  składowe.  Interfejsy  nie  mogą  zawierać  pól.  Wszystkie  składowe  interfejsu  muszą  być 

publiczne. Klasa może dziedziczyć po kilku interfejsach jednocześnie. Interfejs tworzy się z wykorzystaniem 
słowa kluczowego „interface”. 
 
 

 
 
 
 

 
 
 
 

 
 
 
 

background image

Programowanie obiektowe 

Mechanizm dziedziczenia po interfejsie przedstawia poniższy przykład: 
 

 
Przykład 2 – Dziedziczenie po interfejsie 

 

 

Dziedziczenie po wielu interfejsach odbywa się za pomocą konstrukcji: 

class <nazwa klasy> : <nazwa interfejsu 1>, <nazwa interfejsu 2>, ... 

3.  UML – klasy abstrakcyjne i interfejsy 

Klasy abstrakcyjne  w języku UML przedstawia się pisząc ich nazwę oraz nazwę ich metod abstrakcyjnych 

kursywą. 

 

Rys. 1 – Reprezentacja klasy abstrakcyjnej w języku UML 

 

background image

Programowanie obiektowe 

Interfejs oraz dziedziczenie po interfejsie na diagramach klas można przedstawić w dwojaki sposób: 

 

Rys. 2 – Reprezentacja interfejsów w języku UML 

 

Wybór  konkretnej  metody  przedstawienia  interfejsu,  zależy  od  twórcy  diagramu.  Projekty  bardziej 

rozbudowanych  systemów  składają  się  najczęściej  z wielu  diagramów  klas.  Ponieważ  pierwsza  metoda 
pozwala  na  przedstawienie  szczegółów  interfejsu,  powinna  zostać  wykorzystana  na  pierwszym  diagramie, 
który go prezentuje. Na kolejnych diagramach ten sam interfejs może być przedstawiany za pomocą drugiej 
metody, co pozwala na zwiększenie czytelności schematu. 

  

Zadanie 1. Proszę zrealizować aplikację obiektową, która powinna odznaczać się następującymi cechami: 

 

Aplikacja powinna zawierać klasy zaimplementowane zgodnie z zamieszczonym poniżej diagramem klas. 

 

Metody „WypiszInfo”  powinny wypisywać na  ekranie  konsoli informacje na temat wartości wszystkich  pól 

obiektów. 

 

Metody  „ZnajdzPozycje…”  powinny  wyszukiwać  w katalogu  pozycję  spełniającą  dane  kryteria  i zwracać 
odpowiednią referencję. Jeśli żaden obiekt w katalogu nie spełnia danego kryterium, metoda powinna zwrócić 
wartość „null”. 

 

Metoda „WypiszWszystkiePozycje” powinna wypisywać informacje o wszystkich pozycjach w katalogu. 

 

Przechowywanie  obiektów  pozycji  w klasie  „Katalog”  oraz  przechowywanie  obiektów  autorów  w klasie 
„Ksiazka” powinno być zrealizowane za pomocą kolekcji typu „List<T>”. 

 

Należy zwrócić uwagę na to, że klasa „Pozycja” jest klasą abstrakcyjną. 

 

Po wykonaniu zadania należy je przetestować za pomocą własnego kodu testowego. 

 

background image

Programowanie obiektowe 

 

 

Przy ocenie zadania główny nacisk będzie kładziony na: 

 

Prawidłową implementację klasy abstrakcyjnej. 

 

Prawidłową implementację metod. 

 

Utworzony kod testowy i wyniki testów. 

Zadanie 2. Proszę zrealizować aplikację obiektową, która powinna odznaczać się następującymi cechami: 

 

Aplikacja stanowi rozszerzenie i modyfikację aplikacji z zadania nr 1. 

 

Aplikacja powinna zawierać klasy zaimplementowane zgodnie z zamieszczonym poniżej diagramem klas. 

 

Metody do zarządzania pozycjami zostały zdefiniowane w interfejsie „IZarzadzaniePozycjami”.  

 

Metody  „ZnajdzPozycje…”  i „WypiszWszystkiePozycje”  z klasy  „Biblioteka”  mają  przeszukiwać  wszystkie 
katalogi zawarte w bibliotece. 

 

Metoda  „DodajPozycje”  z klasy  biblioteka  ma  dodawać  pozycję  do  katalogu  o podanej  nazwie  działu 

tematycznego. 

background image

Programowanie obiektowe 

 

Należy  zauważyć,  że  metody  do  zarządzania  pozycjami  z klasy  „Biblioteka”  będą  wykonywać  operacje  na 
obiektach typu „Katalog”, wykorzystując przy tym metody zdefiniowane w klasie „Katalog”. 

 

Po wykonaniu zadania należy je przetestować za pomocą własnego kodu testowego. 

 

 

Przy ocenie zadania główny nacisk będzie kładziony na: 

 

Prawidłową implementację interfejsu. 

 

Prawidłową implementację metod odziedziczonych z interfejsu. 

 

Utworzony kod testowy i wyniki testów. 

Zadanie  do  domu.  Proszę  zmodyfikować  zadanie  2,  realizując  operacje  zarządzania  bibliotekarzami  za  pomocą 
metod odziedziczonych z interfejsu „IZarzadzanieBibliotekarzami”. 

 

background image

Programowanie obiektowe 

Zagadnienia, które należy uznać za przyswojone w trakcie zajęć. Po zajęciach będzie obowiązywać praktyczna 
znajomość: 

 

Pojęcia klasy abstrakcyjnej i interfejsu. 

 

Wykorzystanie klas abstrakcyjnych i interfejsów. 

 

Przedstawienie klas abstrakcyjnych i interfejsów na diagramie klas. 

Wybrane  aspekty  dotyczące  implementacji  z wykorzystaniem  języka  Java.  Rozważane  w ramach  niniejszych 
zajęć  aspekty  mogą  być  implementowane  w różnorodnych  technologiach  służących  do  realizacji  aplikacji 
obiektowych, m.in. języku JAVA. Zasadnicze różnice w korzystaniu z języków C# i JAVA w kontekście tematyki 
niniejszego laboratorium są następujące: 

 

W języku Java dziedziczenie interfejsów odbywa się przy użyciu słowa kluczowego „implements”. 

Z kolei analogie w korzystaniu z języka C# i JAVA w kontekście tematyki niniejszego laboratorium są następujące: 

 

Klasy i metody abstrakcyjne oznaczone są słowem kluczowym „abstract”. 

 

Interfejsy oznaczone są słowem kluczowym „interface”.