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

2

2

 

 

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

z wykorzystaniem dziedziczenia. 

Wprowadzenie  teoretyczne.  Rozważana  w ramach  niniejszych  zajęć  tematyka  jest  ważna,  gdyż  dziedziczenie  i 

polimorfizm  są  mechanizmami  wykorzystywanymi  powszechnie  w  programowaniu  obiektowym.  Aby  ze 

zrozumieniem  zrealizować  zadania,  przewidziane  do  wykonania  w ramach  zajęć  laboratoryjnych,  należy  znać 

znaczenie  pojęć  takich  jak:  dziedziczenie,  klasa  bazowa,  klasa  potomna,  polimorfizm,  metoda  wirtualna,  kolekcja 

List<T>  i  jej  podstawowa  funkcjonalność.  Należy  również  znać  podstawy  języka  modelowania  systemów 

informatycznych UML. 

1.  Dziedziczenie 

 

Dziedziczenie polega na tworzenie nowej klasy na podstawie klasy już istniejącej.  

 

W języku C# dziedziczeniu podlegają: pola klasy, właściwości oraz metody. Podobnie jak w C++ elementy 

klasy, które w klasie bazowej zostały oznaczone jako „public” lub „protected”, w klasie potomnej również 

będą miały ten sam zakres widoczności, natomiast elementy oznaczone jako „private” lub „internal”

 

nie 

podlegają dziedziczeniu.  

 

Mechanizm dziedziczenia przedstawia poniższy przykład: 

 
Przykład 1 – Dziedziczenie 

 
 

 

background image

Programowanie obiektowe 

 
 

 

 

 

Proszę zwrócić szczególną uwagę na linię kodu numer 32, w której wywoływany jest konstruktor klasy 

bazowej. W języku C# do wywołania konstruktora klasy bazowej wykorzystywane jest słowo kluczowe 

„base”. 

 

Klasa bazowa (na przykładzie 1 - „Budynek”) to klasa, po której dziedziczy inna klasa nazywana klasą 

potomną (na przykładzie 1 - „BudynekMieszkalny”). 

2.  Polimorfizm 

Pojęcie polimorfizmu odnosi się do klas, które współdzielą te same metody, ale implementują je w różny 

sposób.  W  praktyce  oznacza  to,  że  klasa  potomna  dziedzicząca  daną  metodę  z  klasy  bazowej,  może 

przypisać jej zupełnie inną funkcjonalność. 

 

Mechanizm polimorfizmu przedstawia poniższy przykład: 

 

 
Przykład 2 – Polimorfizm
 

 

background image

Programowanie obiektowe 

 

 

 

Proszę  zwrócić  uwagę  na  sposób  działania  metody  „WypiszInfo”.  W  linii  60  zostaje  wywołana  metoda 

klasy bazowej, natomiast w liniach 62, 64 zostaje wywołana metoda klasy potomnej. 

Proszę  zauważyć,  że  w  linii  63  do  zmiennej  typu  „Budynek”  zostaje  przypisany  obiekt 

„BudynekMieszkalny”, a w linii 64 zostaje wywołana metoda „WypiszInfo” z klasy potomnej. Zadziałał tu 

mechanizm polimorfizmu. 

Metody  z  klasy  bazowej,  które  mogą  zostać  przesłonione  przez  metody  o  tej  samej  nazwie  z  klasy 

potomnej,  należy  oznaczyć  modyfikatorem  „virtual”  (linia 25  w  przykładzie  2). Metody  te  są  metodami 

wirtualnymi

Metody  z  klasy  potomnej,  które  mają  przesłonić  metodę  o  tej  samej  z  klasy  bazowej,  należy  oznaczyć 

modyfikatorem „override” (linia 49 w przykładzie 2). 

3.  Kolekcja List<T> 

Kolekcje to pojęcia stosowane w odniesieniu do klas, które umożliwiają przechowywanie oraz efektywne 

przetwarzanie  obiektów  danego  typu.  Jedną  z  największych  zalet  kolekcji  jest  możliwość  dynamicznej 

zmiany  ich  rozmiaru  –  liczba  przechowywanych  przez  kolekcje  elementów  nie  jest  ograniczona  w 

momencie utworzenia danej kolekcji, tak jak ma to miejsce w przypadku tablicy. 

Jednym z podstawowych typów kolekcji jest lista -  List<T>. Proste operacje wykonywane na liście zostaną 

przedstawione  do  celów  niniejszego  laboratorium.  Szczegółowe  omówienie  możliwości  listy  i  innych 

kolekcji nastąpi na wykładzie. 

Informacje dotyczące kolekcji List<T> niezbędne do wykonania zadania laboratoryjnego: 

 

Klasa List<T> została zdefiniowana w przestrzeni nazw „System.Collections.Generic”. 

 

Litera „T” oznacza typ obiektów przechowywanych przez listę. 

 

Utworzenie obiektu listy odbywa się za pomocą konstrukcji:  

List<T> nazwaListy = new List<T>( )  

gdzie „T” stanowi nazwę typu przechowywanego obiektu. 

 

Podstawowe metody i właściwości listy prezentuje poniższy przykład: 

background image

Programowanie obiektowe 

 

 
Przykład 3 – Metody kolekcji List<T>
 

 

 

4.  UML – dziedziczenie na diagramie klas 

 

Dziedziczenie w języku UML oznaczane jest za pomocą strzałki z pustym grotem wskazującym na klasę 

bazową. 

 

 

Rys. 1 – Reprezentacja dziedziczenia języku UML 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

background image

Programowanie obiektowe 

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 konsoli informacje na temat wartości wszystkich pól obiektów. 

 

Metoda „WypiszInfo” klasy „Osoba” powinna być wirtualna, metody „WypiszInfo” w klasach pochodnych 

(„Student”, „Piłkarz”), powinny ją przesłaniać. 

 

Metoda „StrzelGola” powinna zwiększać o 1 wartość pola „liczbaGoli”. 

 

 

 

Aby zrealizować zadanie należy wykonać następujące kroki: 

 

Proszę o implementację klasy bazowej „Osoba”, jej pól i metod. Proszę pamiętać o modyfikatorze „virtual”, 

który powinna posiadać metoda „WypiszInfo”. 

 

Proszę  o  implementację  klasy  pochodnej  „Student”,  jej  pól  i  metod.  Proszę  pamiętać  o  modyfikatorze 

„override”, który powinna posiadać metoda „WypiszInfo”. 

 

Proszę  o  implementację  klasy  pochodnej  „Pilkarz”,  jej  pól  i  metod.  Proszę  pamiętać  o  modyfikatorze 

„override”, który powinna posiadać metoda „WypiszInfo”. 

 

Proszę o przetestowanie poprawności wykonania zadania za pomocą kodu testowego: 

background image

Programowanie obiektowe 

 

 

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

 

Prawidłową implementację dziedziczenia. 

 

Prawidłowy dobór modyfikatorów dostępu. 

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

 

Aplikacja stanowi rozszerzenie aplikacji z zadania nr 1. 

 

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

 

Obiekty klasy „Student” powinny przechowywać kolekcję obiektów klasy „Ocena” za pomocą listy. 

 

Metoda „DodajOcene” ma dodawać ocenę do listy ocen studenta. 

 

Metoda „WypiszOceny( )” ma wypisywać informacje o wszystkich ocenach studenta. 

 

Metoda  „WypiszOceny(string  nazwaPrzedmiotu)”  ma  wypisywać  informacje  o  ocenach  studenta  z 

przedmiotu o podanej nazwie. 

 

Metoda „UsunOcene” ma usuwać ocenę studenta o podanych parametrach. 

 

Metoda „UsunOceny( )” ma usuwać wszystkie oceny studenta. 

 

Metoda  „UsunOceny(string  nazwaPrzedmiotu)”  ma  usuwać  wszystkie  oceny  studenta  z  przedmiotu  o 

podanej nazwie. 

 

Metoda „WypiszInfo” z klasy „Student” ma wypisywać także informacje o wszystkich ocenach studenta. 

background image

Programowanie obiektowe 

 

Aby zrealizować zadanie należy wykonać następujące kroki: 

 

Proszę o implementację klasy „Ocena”, jej pól i metod. 

 

Proszę o implementację w klasie „Student” następującego pola: 

 

Następnie proszę o dołączenie do projektu przestrzeni nazw „System.Colections.Generic”, z której pochodzi 

używana kolekcja typu „List<T>”, poprzez dopisanie na początku kodu instrukcji: 

 

 

Proszę o implementację metody „DodajOcene” w klasie „Student”. Metoda ta ma tworzyć nowy obiekt typu 

„Ocena” i dodawać go do listy ocen za pomocą metody „Add” obiektu typu „List<Ocena>”. 

 

Proszę o implementację metody „WypiszOceny”, która ma wypisywać na konsoli wszystkie oceny studenta. 

Metoda ta powinna być zaimplementowana przy użyciu pętli „foreach” lub pętli „for”.  

W tym celu niezbędna będzie także implementacja odpowiednich właściwości w klasie „Ocena”. 

 

Proszę o implementację metody „WypiszOceny (string nazwaPrzedmiotu)”, która ma wypisywać na konsoli 

wszystkie oceny studenta z przedmiotu o podanej nazwie. Metoda ta powinna być zaimplementowana przy 

użyciu pętli „foreach” lub pętli „for”.  

 

Proszę o implementację metody „UsunOcene”, która ma usuwać z listy ocen oceny o podanych parametrach. 

Do tego celu należy użyć pętli „for”: 

background image

Programowanie obiektowe 

 

UWAGA! 

W języku C# istnieje prostszy sposób realizacji usunięcia z kolekcji obiektów o podanych parametrach. 

Sposób ten zostanie przedstawiony na jednym z kolejnych wykładów. 

 

Proszę o implementację metody „UsunOceny”, która ma usuwać z listy ocen wszystkie oceny. Do tego celu 

należy użyć metody „Clear” kolekcji typu „List<Ocena>”. 

 

Proszę o implementację metody „UsunOceny (string nazwaPrzedmiotu)”, która ma usuwać z listy ocen oceny 

z przedmiotu o podanej nazwie. 

 

Proszę o modyfikację metody „WypiszInfo” z klasy „Student”. Ma ona wypisywać także listę wszystkich ocen 

studenta. 

 

Proszę  o  przetestowanie  poprawności  wykonania  zadania  za  pomocą  poniższego  kodu,  który  ma  zostać 

dodany do kodu testowego z poprzedniego zadania: 

 

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

 

Poprawną implementację metod. 

background image

Programowanie obiektowe 

 

Prawidłowy dobór modyfikatorów dostępu. 

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

 

Zadanie do domu jest rozszerzeniem zadania 1. 

 

Ilustruje je poniższy diagram klas. 

 

Proszę o utworzenie klas „PilkarzNozny” i „PilkarzReczny”, które dziedziczą po klasie „Pilkarz”. 

 

Metoda  „StrzelGola”  w  klasie  „PilkarzReczny”  ma  wywoływać  metodę  „StrzelGola”  z  klasy  bazowej,  a 

ponadto wypisywać na ekranie konsoli komunikat „Ręczny strzelił!”. 

 

Metoda  „StrzelGola”  w  klasie  „PilkarzNozny”  ma  wywoływać  metodę  „StrzelGola”  z  klasy  bazowej,  a 

ponadto wypisywać na ekranie konsoli komunikat „Nożny strzelił!”. 

 

 

Uwagi: 

 

Metoda  „StrzelGola”  w  klasie  „Pilkarz”  powinna  być  wirtualna,  a  jej  odpowiedniki  w  klasach  potomnych 

powinny ją przesłaniać. 

 

Metody „StrzelGola” z klas potomnych powinny odwoływać się do swoich odpowiedników za pomocą słowa 

kluczowego „base” poprzez konstrukcję: „base.<nazwa metody>” 

 

 

background image

Programowanie obiektowe 

10 

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

znajomość: 

 

Pojęcia dziedziczenia i polimorfizmu. 

 

Tworzenie metod wirtualnych i ich przesłanianie. 

 

Wykonywanie prostych operacji na kolekcjach „List” z przestrzeni nazw „System.Collections.Generic”. 

 

Przedstawienie dziedziczenia na diagramie klas. 

Zagadnienia  do  powtórzenia  na  następne  zajęcia.  Przed  kolejnymi  zajęciami  należy  powtórzyć  następujące 

zagadnienia: 

 

Klasy abstrakcyjne. 

 

Interfejsy. 

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 odbywa się przy użyciu słowa kluczowego „extends”. 

 

W języku Java odpowiednikiem słowa kluczowego „base” jest słowo „super”. 

 

W języku Java wywołanie konstruktora klasy bazowej odbywa się w ciele konstruktora klasy potomnej. 

 

W języku Java nie istnieje modyfikator „virtual”, każda metoda jest domyślnie wirtualna. 

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

 

W języku Java również nie istnieje wielodziedziczenie klas. 

 

Mechanizm dziedziczenia w języku Java odbywa się na takiej samej zasadzie, jak w języku C#. 

Uwagi szczegółowe dotyczące implementacji w języku Java są następujące: 

 

Poniższy przykład przedstawia implementację dziedziczenia w języku Java. Jest odpowiednikiem przykładu nr 

1. 

 

 

 

 

 

 

 

background image

Programowanie obiektowe 

11 

Przykład 4 – dziedziczenie w języku Java 

 

 

 

Poniższy przykład przedstawia mechanizm polimorfizmu w języku Java. Jest odpowiednikiem przykładu nr 2. 

 

Przykład 5 – polimorfizm w języku Java 

 

background image

Programowanie obiektowe 

12