Instrukcja 3 PROGRAMOWANIE OBIEKTOWE

Podobne dokumenty
Kurs WWW. Paweł Rajba.

PHP 5 język obiektowy

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Wykład 8: klasy cz. 4

OBIEKTY PHP. G. Panuś

10. Programowanie obiektowe w PHP5

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Materiały do zajęć VII

Enkapsulacja, dziedziczenie, polimorfizm

Aplikacje w środowisku Java

TEMAT : KLASY DZIEDZICZENIE

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie WEB Lista nr 10 (termin ) mgr inż. Adam Dudek

Programowanie obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Technologie i usługi internetowe cz. 2

Dziedziczenie. Tomasz Borzyszkowski

Laboratorium 1 - Programowanie proceduralne i obiektowe

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Dokumentacja do API Javy.

Programowanie obiektowe

Wykład 5: Klasy cz. 3

Podstawy Programowania Obiektowego

Podstawy programowania III

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

.NET Klasy, obiekty. ciąg dalszy

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Aplikacje w środowisku Java

Mechanizm dziedziczenia

PARADYGMATY PROGRAMOWANIA Wykład 4

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Czym są właściwości. Poprawne projektowanie klas

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Programowanie obiektowe

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Wykład 6: Dziedziczenie

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Definiowanie własnych klas

Programowanie obiektowe. Wykład 4

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Programowanie obiektowe - 1.

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Wstęp do programowania obiektowego. Wykład 2

Wykład 9: Polimorfizm i klasy wirtualne

Wstęp. Ale po co? Implementacja

Programowanie obiektowe

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Laboratorium 7 Blog: dodawanie i edycja wpisów

Dziedziczenie jednobazowe, poliformizm

Klasy abstrakcyjne, interfejsy i polimorfizm

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Wykład 9: Metody wirtualne i polimorfizm

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Zaawansowane programowanie w C++ (PCP)

Deklaracja struktury w C++

Programowanie komputerowe. Zajęcia 7

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Język C++ Programowanie obiektowe

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Mechanizm dziedziczenia

Klasy abstrakcyjne i interfejsy

Obiektowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

PHP: bloki kodu, tablice, obiekty i formularze

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Wykład 4: Klasy i Metody

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Podstawy Języka Java

Dziedziczenie. dr Jarosław Skaruz

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Wykład 5 Okna MDI i SDI, dziedziczenie

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Zaawansowane programowanie w C++ (PCP)

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

C++ - [4-7] Polimorfizm

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

dr inż. Jarosław Forenc

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie obiektowe

Transkrypt:

Instrukcja 3 PROGRAMOWANIE OBIEKTOWE Programowanie strukturalne jest szybkie i efektywne. Niestety gdy mamy do czynienia z naprawdę dużym projektem organizacja kodu poprzez struktury może stać się bardzo kłopotliwa, a skrypty nieczytelne. Inżynierowie programowania szukali rozwiązania, które pozwoliło by w łatwy sposób dzielić programy na moduły łatwo dające się włączać/wyłączać z aplikacji. Tak zrodziła się idea obiektowości. Programista tworzy klasę twór mogący posiadać swoje własne zmienne (zwane polami) i funkcje (zwane metodami). Trzeba pamiętać by odróżniać KLASĘ od OBIEKTU; klasą jest definicja konkretnych składowych (pola i metody); obiektem jest natomiast zmienna typu własnego (typem jest klasa). Przykład klasy: class Klasa { private $var1 = 12; public $var2 = 13; function f() { echo $this->var1; $klasa = new Klasa(); echo $klasa->var2; Jak widać definicja klasy zawsze rozpoczyna się od słowa zastrzeżonego class. Po nim podaje się jej nazwę (dowolną, jedynie nie można wybrać na nazwę słów zastrzeżonych przez język). Dobrym programistycznym zwyczajem jest rozpoczynanie nazwy klasy od dużej litery (chociaż nie jest to przymusowe). Wszystkie składowe klasy umieszcza się pomiędzy jej klamrami; Przyjrzyjmy się teraz zdefiniowanym składowym. Każda ze składowych (zmienna lub funkcja) może posiadać określenie widoczności. Umożliwia to przykładowo ukrywanie konkretnej składowej przed dostępem do niej spoza samej klasy. Jako przykład niech posłuży wcześniejszy przykład. Proszę zmodyfikować go przy funkcji echo; zmienną var2 proszę zamienić na var1. Parser powinien zwrócić błąd. Nie zwróciłby błędu gdybyśmy wywołali funkcję f(). Tutaj klasa wywołuje swoją zmienną dzięki czemu mamy do niej dostęp. Tak właśnie zachowują się składowe prywatne. Przeciwieństwem ich są składowe publiczne je można normalnie wywoływać spoza samej klasy (jak to miało miejsce w przypadku zmiennej $var2). Do czego taki podział jest potrzebny? Między innymi do tego, aby którykolwiek z modułów, bez pozwolenia twórcy klasy, nie został zmodyfikowany niejawnie przez inny element. Przeważnie dostęp do konkretnych pól klasy odbywa się właśnie poprzez funkcje (zwykło się je nazywać get_<nazwa_zmiennej>() do pobrania wartości, set_<nazwa_zmiennej>(wartosc) do ustawienia); uodparnia to program na występowanie nieoczekiwanych błędów. Domyślnie funkcje klasy są definiowane jako publiczne; im również można nadać właściwość prywatną (wtedy są widoczne tylko dla danej klasy). Innym zastosowaniem określania widoczności składowych ujawni się wraz z pojęciem dziedziczenia klas (chodzi o nienakładanie się składowych klasy bazowej i pochodnej). Pojęcie widoczności pól i metod w programowaniu nazywa się hermetyzacją (enkapsulacją). Osobnego komentarza wymaga pseudo-zmienna $this. Zmienna ta tworzy się wraz z obiektem. Przechowuje ona odnośnik do niego samego. Dzięki temu możemy np. w metodzie klasy odwoływać się do poszczególnych jej pól. Uwydatnia to przykład funkcji drukującej wartość $var1, która to przy normalnym wywołaniu powoduje wyświetlenie informacji o próbie dostępu do składowej prywatnej. We wspomnianej funkcji, jeżeli nie użylibyśmy zmiennej $this, również nie

mielibyśmy dostępu do $var1; to z kolei wynika z właściwości funkcji (widzi tylko zmienne definiowane w jej ciele bądź parametrach wejściowych, nie poza nią). Linia: $klasa = new Klasa(); powoduje utworzenie zmiennej typu obiektowego $klasa. Tutaj pojawia się nam operator new. Dzięki niemu właśnie tworzona jest NOWA instancja (byt) obiektu (niezależna od żadnego innego aktualnego bytu). Drugim operatorem obiektów jest słowo clone. W przeciwieństwie do operatora new nie tworzy on nowego obiektu lecz klonuje aktualnie powołany do życia. $klasa2 = clone $klasa; $klasa2 przejmuje wszystkie wartości z $klasa. Od tego momentu są osobnymi bytami zmiana wartości w jednym nie powoduje zmiany w drugim. Oczywiście możliwe jest także zreferowanie jednego obiektu do drugiego. Wtedy zachowuje się on jak każda zreferowana zmienna w chwili zmiany parametru jednej zmiennej powoduje zmianę tego parametru w drugiej. Zadanie: Proszę stworzyć skrypt z klasą o dowolnej nazwie (np. Pracownik, Osoba), która będzie zawierała następujące pola: id, imię, nazwisko, funkcja. Wszystkie pola powinny być prywatne. Proszę stworzyć metody dostępowe dla każdej ze zmiennej. Dodatkowo proszę stworzyć kolejną klasę o dowolnej nazwie (np. Funkcja, Stanowisko) zawierającą pola o nazwie id, nazwa, miejsce. One również powinny być prywatne i powinny posiadać swoje metody dostępowe. Proszę teraz przetestować swój program w następujący sposób: utworzyć kilka obiektów pierwszej klasy (np. 3). Każdej z nich ustawić odpowiednie wartości pól. Pole funkcja proszę uzupełnić inaczej trzeba do niej przypisać wartość obiektu utworzonego z drugiej klasy. Proszę przynajmniej do dwóch obiektów pierwszej klasy przypisać ten sam obiekt utworzony z drugiej klasy. Na koniec do pierwszej klasy należy dołączyć metodę wyświetlającą wszystkie pola tej klasy (w tym pola drugiej) w czytelnej postaci dla odbiorcy. Ostatecznie proszę wywołać te metody. 1. Wbudowane metody klas. Klasy mogą posiadać w zasadzie dowolne metody. Jednak istnieją też metody wbudowane, które wywołują się nawet bez jawnego ich wywołania przez programistę. Przeważnie funkcje są już domyślnie zdefiniowane; w związku z powyższym nie zachodzi potrzeba pisania ich kodu samemu; możliwe jest jednak ich nadpisanie - nazywa się to przeładowaniem funkcji. Oznacza to, że jeżeli w definicji naszej klasy pojawi się funkcja o takiej właśnie nazwie to jej domyślna wersja zostanie zastąpiona naszą. Funkcje, które można przeładować posiadają nazwę rozpoczynającą się od ' ', np. call(), construct(), destruct(), itp. void construct(mixed argument1,, mixed argumentn) wszystkie parametry tej metody są opcjonalne (czyli nie trzeba podawać żadnego). Jej wywołanie jest automatyczne. Wywołuje się w chwili użycia operatora new (stąd jego nazwa - konstruktor). Można oczywiście samemu wywoływać tę metodę; tę możliwość omówimy jednak przy innej okazji. Dzięki konstruktorowi da się przypisać pożądane wartości dla poszczególnych pól klasy (bądź domyślne w przypadku braku argumentów). Jeżeli klasa nie posiada zdefiniowanego własnego konstruktora stosowany jest domyślny konstruktor (z domyślnej, podstawowej klasy) void destruct(void) metoda ta wykonuje się gdy obiekt wskazanej klasy jest niszczony. Własne definiowanie destruktora przydaje się przeważnie wtedy, kiedy dany obiekt ma coś wykonać przy zakończeniu swojego istnienia (modyfikacja zmiennych, wyświetlenie jakiegoś komunikatu itp.).

Tak jak konstruktor, destruktor wywoływany jest automatycznie np. przy zakończeniu działania skryptu; może też zostać wywołany podczas działania skryptu w wypadku gdy nie ma już w kodzie więcej odniesień do danego obiektu. public void set(string $nazwa, mixed $value) metoda ta jest wywoływana gdy następuje wywołanie zapisu do zastrzeżonej (prywatnej) zmiennej ($nazwa określa jej nazwę, $value wartość jaką ma przyjąć) public mixed get(string $nazwa) metoda wykona się przy wywołaniu odczytu wartości prywatnej zmiennej ($nazwa określa jej nazwę) public bool isset(string $nazwa)/void unset(string $nazwa) funkcje te wywołują się w chwili gdy wywoływane są funkcje isset()/unset() dla zmiennych prywatnych. public string tostring(void) funkcja decyduje co zostanie zwrócone, gdy obiekt zostanie potraktowany jako ciąg znakowy. void clone(void) metoda pozwala określić jak ma zachować się obiekt po sklonowaniu; chodzi głównie o ewentualną zmianę konkretnych pól klasy dla nowo tworzonej (np. zamiana imienia na pusty ciąg znakowy). Zadanie. Proszę przebudować program z poprzedniego ćwiczenia. Modyfikacja polegać powinna na przeciążeniu metod konstruktora i destruktora (dopisać domyślne uzupełnianie pól); dodać do konstruktora możliwość dodawania parametrów (zamiast kolejnych modyfikacji poszczególnych parametrów). Wykorzystać funkcję clone() do modyfikowania zmiennej id; zamiast każdorazowo tworzyć nowy obiekt i ustawiać id spróbować operatora clone (klonować pierwszy obiekt do drugiego, drugi do trzeciego itd.). Na koniec spróbować dodać metodę tostring() - ma wyświetlać np. imię i nazwisko wywoływanego obiektu z osobą. 2. Składowe statyczne. Składowe klas mogą być opatrzone słowem zastrzeżonym static. Niezależnie czy użyjemy tego słowa przy deklaracji pola lub metody efekt będzie ten sam konkretne pole będzie posiadało status statycznej (działa to tak jak użycie słowa static przy zmiennej lokalnej w danej funkcji); ponadto jeżeli używamy tego słowa w klasie dane pole lub metoda mogą być wywoływane nawet gdy obiekt danej klasy NIE ISTNIEJE. Przykładowo jeżeli w klasie dodamy metodę, która miała by zwracać jedynie wynik mnożenia podanego parametru to czasem nie warto jest tworzyć całego obiektu w danej części kodu wtedy wystarczy wywołać tą metodę poprzez taką instrukcję: $zmienna = <nazwa_klasy>::<nazwa_metody>(<parametry>); Tutaj pojawia się kolejny klasowy operator - '::'. Jest on niejako spójnikiem - łączy nazwę klasy z jej statycznym polem/metodą. Dzięki niemu możemy się do tego typu składowej odwołać. Z kolei jeżeli chcemy w ciele klasy zmienić wartość pola statycznego to robimy to poprzez słowo self, np. static private $var1 = 2; public function increasevar() { ++self::$var1;

Zadanie Poprzednie zadanie z automatycznym nadawaniem id działało jednak wymagało od programisty klonowania obiektu najmłodszego. Proszę tak zmodyfikować kod aby klonowanie następowało po pierwszym, domyślnym obiekcie. Do tego celu należy stworzyć w programie obiekt-rodzica. Następnie każdy kolejny będzie tworzony poprzez poprzez klonowanie właśnie jego. Aby id się zwiększało należy jego deklarację poprzedzić słowem static. Zadanie dodatkowe: Proszę dorobić do aktualnego kodu formularz dodawania nowych osób i/lub nowych stanowisk. W formularzu dodawanie stanowiska dla konkretnej osoby proszę stworzyć jako combobox. Poszczególne dane proszę przekazywać pomiędzy skryptem jako zmienne sesyjne; dodawanie nowych z formularza osób jako post; formularz dodawania nowych stanowisk proszę przesyłać jako get. Proszę stworzyć odsyłacz, po którego aktywacji wyświetli nam się lista albo wszystkich dodanych osób, albo stanowisk. Po ewentualnym kliknięciu na daną osobę i/lub stanowisko proszę spowodować kasowanie tejże pozycji. Zarówno osoby jak i stanowiska należy przechowywać jako typ tablicowy (jeden element tablicy = jeden obiekt). 3. Dziedziczenie. Programowanie obiektowe udostępnia mechanizm tzw. dziedziczenia. Weźmy pod uwagę nasz rozwijany przykład - posiadamy klasę Osoba z polami id, imię, nazwisko, funkcja. Sama w sobie jest uniwersalna możemy pod nią podłączyć dowolną osobę z dowolnej instytucji, fabryki, szkoły, forum internetowego itd. Czasem jednak chcielibyśmy większej personalizacji pod konkretny projekt przykładowo dostosowując klasę pod instytucję szkolną. Mamy w niej następujący podział: porządkowi (godziny dyżuru, telefon), nauczyciele (specjalność, e-mail, telefon, wychowawstwo klasy, opieka_sali, id_plan), administracja (numer_pokoju, godziny_urzedowania), uczniowie (id_klasy, funkcja_klasowa, id_rodzic, id_dziennika), rodzice (dane_kontaktowe, funkcja_w_szkole). Jak widać mamy kilka typów osób, które posiadają pewne unikalne dane prywatne. Deklarowanie w każdej klasie tych samych pól byłoby męczące. Tutaj pojawia się istota dziedziczenia klasowego nasza klasa Osoba będzie klasą bazową; klasy Porzadkowy, Nauczyciel, Administrator, Uczen oraz Rodzic będą pochodnymi klasy Osoba. Deklaracja klasy pochodnej wygląda następująco: class KlasaBaza { //cialo klasy class KlasaPchodna extends KlasaBaza { //kod klasy bazowej W naszym wypadku: class Osoba { private $id; private $imie; private $nazwisko; private $funkcja; public function get_imie() {

return $this->imie; public function set_imie($imie) { $this->imie = $imie; //pozostale set i get; class Porzadkowy extends Osoba { private $dyzur; private $numer_kontakt; //set i get dla parametrow $porzadkowy = new Porzadkowy(); $porzadkowy->set_imie( Marian ); echo $porzadkowy->get_imie(); Zadanie: Proszę utworzyć klasy pochodne do klasy Osoba. Proszę oprogramować dodawanie nowych osób do szkoły oraz ich funkcje (np. nauczyciel, uczeń, absolwent itd.) Dodatkowo proszę się zastanowić nad utworzeniem nowych klas Dziennik oraz Plan. Jakie pola powinny zawierać? Wraz z dziedziczeniem klasy pojawia się jeszcze jeden typ hermetyzacji danych protected (obok public oraz private). Jeżeli pole lub metoda są poprzedzone słowem protected to wskazana składowa nie będzie widziana poza klasą (traktowana jest jako prywatna); jednak dla klasy pochodnej będzie ona widziana jako publiczna (należy pamiętać, że składowa private klasy bazowej NIE JEST widoczna w klasie bazowej). Proszę przetestować jak wcześniejszy przykład zachowa się, gdy składowe klasy bazowej zostaną zmieniona na protected. 4. Polimorfizm Polimorfizm (wielopostać) w ujęciu obiektowości nazywa się też podtypowaniem. Polega on na zamienianiu/poszerzaniu możliwości wcześniej zdefiniowanej metody klasy bazowej. Dzięki temu np. funkcja wyświetl() w klasie pochodnej wyświetli nam dane z klasy pochodnej nawet gdyby w klasie bazowej istniała identyczna funkcja wyświetlająca dane charakterystyczne dla klasy bazowej. Przykład. class Baza { public $dane_baza = To jest tekst klasy bazowej ; echo $this->dane_baza;

class Pochodna extends Baza { public $dane_pochodne = To jest tekst klasy pochodnej ; echo $this->dane_pochodne; $zm = new Pochodna(); $zm1 = new Baza(); $zm->wyswietl(); $zm1->wyswietl(); Przykład oddaje idee polimorfizmu (podtypowania). Zadanie. Do poprzedniego przykładu (ze szkołą) proszę podtypować w klasach pochodnych funkcję z klasy bazowej odpowiadającą za wyświetlanie zapisanych danych osobowych (na tą chwilę po wywołaniu funkcji drukującej wyświetlą się tylko dane z klasy bazowej). 5.Klasy abstrakcyjne. Klasami abstrakcyjnymi nazywamy takie, które posiadają jedynie DEKLARACJE odpowiednich metod (bez definiowania co mają konkretnie robić). Tego typu klasy można wykorzystywać jako bazowe dla kolejnych klas; Dzięki nim można nadpisywać działanie odpowiednich metod w kolejnych klasach. Parser wymusza zdefiniowanie abstrakcyjnych metod w klasie pochodnej (wywoła błąd krytyczny w przypadku ich braku). Stosowanie klas abstrakcyjnych ujednolica kod klas i czyni go czytelniejszym. Przykład. abstract class Sterowanie { abstract public function wyswietl(); abstract public function dodaj($wartosc); abstract public function usun($watosc); class Osoba extends Sterowanie { private $id; private $name; echo $id.. $name; public function dodaj($wartosc) { $this->id = $this->id + 1; $this->name[$this->id] = $wartosc; public function usun($wartosc) { $this->id = $this->id 1;

unset($this->name[$wartosc]); class Funkcja extends Sterowanie { private $id; private $name; echo $id.. $name; public function dodaj($wartosc) { $this->id = $this->id + 1; $this->name[$this->id] = $wartosc; public function usun($wartosc) { $this->id = $this->id 1; unset($this->name[$wartosc]); Zadanie. Proszę zmodyfikować poprzedni przykład o klasę abstrakcyjną odpowiadającą za funkcję dodawanie, modyfikowanie i usuwanie odpowiednich pól klas Osoby oraz Funkcji. Ponadto proszę dodać do tej abstrakcyjnej klasy metodę wyświetlającą pola poszczególnych klas. Proszę zobaczyć jak funkcjonuje tak zmodyfikowany skrypt.