1. Programowanie obiektowe. Wstęp.

Podobne dokumenty
Podstawy Programowania semestr drugi. Wykład czternasty

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

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

Wykład 9: Polimorfizm i klasy wirtualne

Wykład 9: Metody wirtualne i polimorfizm

Język programowania. Andrzej Bobyk

Podstawy Programowania Obiektowego

Delphi podstawy programowania. Środowisko Delphi

Podstawy programowania. Wykład PASCAL. Wstęp do programowania obiektowego. dr Artur Bartoszewski - Podstawy programowania, sem.

Programowanie obiektowe - 1.

Język programowania PASCAL

PARADYGMATY PROGRAMOWANIA Wykład 4

Wykład 8: klasy cz. 4

Spis treści. 1 Java T M

Programowanie obiektowe

Materiały do laboratorium MS ACCESS BASIC

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

Programowanie obiektowe

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

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

Programowanie obiektowe

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Dziedziczenie jednobazowe, poliformizm

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

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

Zapis programu z wykorzystaniem modułu (Podstawy Delphi 2.1, 2.2, 2.3 str11 )

Podstawy Programowania 2

Programowanie w Turbo Pascal

Dziedziczenie. Tomasz Borzyszkowski

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

Oracle PL/SQL. Paweł Rajba.

TEMAT : KLASY DZIEDZICZENIE

Technologie i usługi internetowe cz. 2

Aplikacje w środowisku Java

Programowanie obiektowe

Lista 5 Typy dynamiczne kolejka

Wykład 5: Klasy cz. 3

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

Wprowadzenie do systemu Delphi

Programowanie RAD Delphi

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

Podstawy algorytmiki i programowania - wykład 4 C-struktury

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

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego kodu bez edycji (i ewentualnego wprowadzania

Programowanie obiektowe

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

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

Aplikacje w środowisku Java

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Klasy abstrakcyjne i interfejsy

Programowanie Obiektowe i C++

Wykład VII PASCAL - grafika;

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Baza danych sql. 1. Wprowadzenie

Język C++ zajęcia nr 2

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

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

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

Programowanie obiektowe. Wykład 4

Przeciążanie operatorów

PROGRAM: WYSZUKANIE LICZBY MAKSYMALNEJ

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

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

Deklaracja struktury w C++

Programowanie, część I

Dziedziczenie. dr Jarosław Skaruz

Zaawansowane programowanie w języku C++ Klasy w C++

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

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

Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C

Ada-95. Dariusz Wawrzyniak

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

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

Programowanie obiektowe

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

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

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

Kurs WWW. Paweł Rajba.

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

Zaawansowane programowanie w C++ (PCP)

C-struktury wykład. Dorota Pylak

Materiały do zajęć VII

Wprowadzenie do programowanie obiektowego w języku C++

Polimorfizm. dr Jarosław Skaruz

Do czego służą klasy?

Typy sparametryzowane

Rozdział 4 KLASY, OBIEKTY, METODY

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

3 Delegacje. 3.1 Tworzenie delegacji. 3.2 Skojarzenie delegacji z procedurą czy funkcją

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

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie obiektowe w Pascalu

Transkrypt:

1. Programowanie obiektowe. Wstęp. Literatura: Neil J. Rubenking, Understending and Programming in Object-Oriented-Pascal, PC Magazine, February 27, 1990, p. 263. Turbo Pascal w wersji 5.5 i wyższych dopuszcza struktury typu obiekt(ang. object), które podobnie jak rekordy składają się z pól danych oraz z dodatkowych pól zawierających zgłoszenia tzw. metod, a więc funkcji i procedur operujących na tych danych. Taki sposób mieszania danych nosi nazwę enkapsulacji. Pola metod w deklaracjach object są podobne do deklaracji forward funkcji czy procedur. Część implementacyjna, a więc opis metod, pojawia się w następnej kolejności, już po ich zgłoszeniu i poza deklaracją obiektu. Nazwa obiektu kwaliمحkuje nazwę metody(podobnie jak nazwa pola rekordu jest na zewnątrz kwaliمحkowana nazwą zmiennej określonego typu rekordowego wraz zkropkąinazwąwewnętrznejpola.np. a.x rekorda;polex). Jako przykład podam krótki program(neil J. Rubenking), który wyświetla standardowe powitanie Hello na ekranie terminala. TYPE message = OBJECT words : string; CONSTRUCTOR Init(is : String); PROCEDURE Say; CONSTRUCTOR Message.Init(is : String); self.words := is; PROCEDURE Message.Say; Write(self.words); VAR H: message; H.Init( OOHello ); H.Say END. Program ten deklaruje obiekt message, który składa się z pola danych o nazwie words oraz dwóch metod: Init i Say. Metoda Init zwana constructor jest specjalną metodą, która inicjuje dane typu message. Musi ona być wywołana przed użyciem obiektu. W programie Hello wywołanie to odbywa się przez H.Init( OO Hello ); Dopiero po tym, łańcuch OO Hello jest dostępny dla metody Say, która drukuje go.dziejesiętowlinii H.Say; Rozszerzymy teraz program Hello tak, by pokazać bardzo podstawowe mechanizmy programowania obiektowego. Załóżmy, że chcemy teraz wypisąć łńcuch OOP Hello w dowolnym, ale określonym przez współrzędne, miejscu ekranu. W przypadku starego stylu programowania musieli byśmy napisać nowy program. W OOP można w prosty sposób rozszerzać istniejące programy w dowolnym kierunku. 1

1.1. Dziedziczenie Następny fragment programu(hello2.pas) jest biblioteką Turbo Pascala. Rozpoczyna go identyczna jak poprzednio deklaracja obiektu message. W następnej części zdeمحniowany jest obiekt o nazwie placemessage, którego zmiennymi są wielkości zawierające współrzędne położenia napisu na ekranie. W następnej kolejności zdeمحniowano obiekt colormessage, w którym dodatkowo zadeklarowany został kolor tekstu napisu. Wszystkie wprowadzone obiekty dotyczą napisu, lecz każdy z nich różni się od poprzedniego jakąś dodatkową cechą czy możliwością, które opisująwłasnościnapisu,atojegopołożenie,atokolor,itd. UNIT Hello2; (* Turbo Pascal 5.5 version *) INTERFACE USES Crt; TYPE message = OBJECT words : String; CONSTRUCTOR Init(is : String); placemessage = OBJECT(message) X,Y:Byte; CONSTRUCTOR InitPM(is : String; ix, iy : Byte); colormessage = OBJECT(placemessage) color, SaveColor : Byte; CONSTRUCTOR InitCM(iS : String; ix, iy, icolor : Byte); MsPt = ^Message; PMpt = ^PlaceMessage; CMpt = ^ColorMessage; MsgList = ^MsgNode; MsgNode = RECORD data :MsPt; next : MsgList; List = OBJECT Nodes : MsgList; CONSTRUCTOR Init; PROCEDURE Add(MP : MsPt); PROCEDURE Show; IMPLEMENTATION CONSTRUCTOR Message.Init(iS : String); self.words := is; 2

PROCEDURE Message.Say; Write(self.words); CONSTRUCTOR PlaceMessage.InitPM(iS : String; ix, iy : Byte); Message.Init(iS); self.x := ix; self.y := iy; PROCEDURE PlaceMessage.Say; GotoXY(self.X, self.y); Message.Say; CONSTRUCTOR ColorMessage.InitCM(iS : String; ix, iy, icolor : Byte); PlaceMessage.InitPM(iS, ix, iy); self.color := icolor; PROCEDURE ColorMessage.Say; self.savecolor := TextAttr; TextAttr := self.color; PlaceMessage.Say; TextAttr := self.savecolor; CONSTRUCTOR List.Init; self.nodes := NIL; PROCEDURE List.Add(MP : MsPt); VARP:MsgList; New(P); P^.data := MP; P^.next := self.nodes; self.nodes := P; PROCEDURE List.Show; VARP:MsgList; P := self.nodes; WHILEP<>NILDO P^.data^.say; P := P^.next; 3

END. Po słowie OBJECT, w przypadku obiektu placemessage, umieszczone zostało w nawiasie słowo message i podobnie, po zgłoszeniu obiektu colormessage umieszczono słowo placemessage. Oznacza to, że zmienne typu placemessage są wciąż zmiennymi message, tzn. dziedziczą wszystkie ich własności, a więc pola danych i metody. Podobnie pochodne zmienne typu colormessage przejmą po swoich przodkach, w tym wypadku po obiektach message i placemessage. Dodatkowo, zmienne te mają jeszcze inne, swoje, własności. Mamy tu taką sytuację, że typy pochodne, a więc spadkobiercy, dziedziczą po swoich przodkach pewne cechy. Nazywa się je również typami potomnymi. Typy potomne mają na ogół dodatkowe własności, inne niż ich przodkowie. Przedyskutujmy to dokładnie na przykładzie placemessage. W porównaniu z messsage, placemessage jest typem, który rezerwuje dwa pola(dodatkowo do pola words), w których przechowywane będą współrzędne x, y położenia napisu na ekranie. Zmieniona również została metoda constructor, która teraz nosi nazwę InitPM i może inicjować zmienne typu placemessage. Inna jest też metoda Say. Wypisuje ona łańcuch na ekran w miejscu określonym przez x, y. Metody, które można zmieniać w typach potomnych opatruje się słowem virtual (wirtualna). Tak jest z metodą Say w obiekcie message. Nie można zmieniać nagłówka metody wirtualnej w typie potomnym. Metoda placemessage.initpm ustawia własne pola x, y. Na początku woła ona dziedziczoną metodę message.init w celu inicjacji pola words, a następnie ustawia x, y. Metoda placemessage.say po przemieszczeniu kursora do miejsca ekranu(x, y)(zostały one dodatkowo opatrzone słowem Self; patrz dalej) wywołuje metodę swojego przodka message.say aby wypisać tam dany łańcuch. Obiekt placemessage jest przodkiem obiektu colormessage i potomkiem pierwotnego obiektu message. Następne deklaracje w jednostce Hello2 ustalają wskazy do różnych obiektów w zadanej hierarchii oraz deمحniują listę połączoną wskazów do oryginalnego typu message. Ta lista staje się polem danych w obiekcie List, którego metody, dodają (Add) oraz pokazują(show) komunikaty(messages). WOOPascalutypypotomnesąwbardzoszczególnysposóbzgodnezichprzodkami. Polegatonatym,że wskazdozmiennejtypuprzodkamożewskazywać zmienne wszystkich typów potomnych. Procedura, której parametr formalny opatrzony słowem VAR jest procedurą(funkcją) przyjmie jako argument aktualny zmienną dowolnego typu potomnego(też procedurę). Obiekt zachowuje przy tym swoją indywidualność, a wywoływane metody wirtualne będą właściwymi dla niego metodami. W przykładzie Hello2 parametrami aktualnymi procedury List.Add mogą być zmienne dowolnego z trzech zadeklarowanych typów: message, placemessage, colormessage. 1.2. Polimorfizm Metoda List.Show bierze kolejne elementy listy i wywołuje ich metody Say. Nie zwraca przy tym uwagi na szczegóły dotyczące obiektu. P^.data^ jest obiektem, któregotypnieniejestznanyażdochwiliwywołania.mamytudoczynieniaztzw. obiektem polimorمحcznym, o potencjalnie różnych własnościach. Jeśli kompilator napotyka na zwykłą procedurę statyczną wówczas może od razu odwołać się do konkretnego adresu. Jest to metoda tzw. wczesnego kojarzenia, lub związania(early 4

binding). W przypadku metod wirtualnych obiektu polimorمحcznego, kompilator nie może z góry określić adresu. W czasie wykonywania się programu wybierana jest właściwa metoda, zależna od szczególnego typu zmiennej obiektowej. Takie kojarzenie wywołań nosi nazwę późnego. 1.3. Przykład Program UseHello, pokazany na następnym diagramie, ilustruje zadziwiające własności obiektów polimorمحcznych. PROGRAM UseHello; (* 5.5 *) USES Crt, hello2; TYPE MMpt = ^MovingMessage; MovingMessage = OBJECT(ColorMessage) width : Byte; CONSTRUCTOR InitMM(iS : String; ix, iy, icolor, iwid : Byte); CONSTRUCTOR MovingMessage.InitMM(iS : String; ix, iy, icolor, iwid : Byte); ColorMessage.InitCM(iS, ix, iy, icolor); self.width := iwid; PROCEDURE MovingMessage.Say; VAR marquee : String; P :Byte; FillChar(marquee, SizeOf(marquee), ); marquee[0] := chr(self.width); P :=1; self.savecolor := TextAttr; TextAttr := self.color; REPEAT GotoXY(self.X, self.y); Write(marquee); MOVE(marquee[2], marquee[1], pred(self.width)); marquee[self.width] := self.words[p]; P := succ(p MOD length(self.words)); sound(20); Delay(60); NoSound; delay(75); UNTIL KeyPressed; TextAttr := self.savecolor; VAR TheList : List; 5

ClrScr; TheList.Init; TheList.Add(new(MMpt,InitMM( OOP!,9,16,$1C,60))); TheList.Add(new(CMpt, InitCM( Hello in living color!, 20,10,$4E))); TheList.Add(new(PMpt, InitPM( Hello from down under,1,25))); TheList.Add(new(MsPt, Init( Hello, World! ))); TheList.Show; END. Program UseHello korzysta wprost z biblioteki Hello2,. Deklaruje on dodatkowy typ, obiekt movingmessage, który jest rozszerzeniem obiektu colormessage. Obiekt ten nie istniał w bibliotece Hello2 w momencie jej kompilacji, a więc w chwili tworzenia modułu Hello2.tpu. Mimo to, metody List.Add oraz List.Show radzą sobie ze zmiennymi nowego typu! Ma tu miejsce zgodność typów potomnych z ich przodkami. Zwróćmy uwagę na użycie procedury New. Jeśli chcemy umieściś w pamięci komputera zmienną dynamiczną z jej metodami wirtualnymi to procedurę New wywołujemy z parametrami, którymi są nazwa obiektu i konstruktor tego obiektu. Np. New(MojObiekt, Init(1, 2, 3);) Po drugie, można używać New z argumentem typu pointer tak jakby była to funkcja, zwracająca wskaz do zmiennej danego typu. Można więc tworzyć wskazy i przekazywać je jako parametry bez potrzeby tworzenia i inicjowania zmiennych tymczasowych. 1.4. Podsumowanie Program Hello ilustruje cztery podstawowe własności programowania obiektowego, którymi są: تح enkapsulacja(encapsulation) تح dziedziczenie(inheritance) تح rozszerzalność(extendability) تح wielopostaciowość(polimorphism) Zadanie 1. Napisz program Pomocnik, który na podstawie zadanego numeru wyświetla linię tekstu dowolnej długości. Taki program może zarządzać bazą, która zawiera te linie tekstu(może je więc dodawać, usuwać, wypisać). Wykorzystaj OOP. 1.5. Parametr Self Załóżmy, że w programie występuje deمحnicja typu rekordowego(marciniak) type nowe\_xy=record x, y: integer; kolor: byte; oraz deمحnicja typu obiektowego type xy=object x, y: integer; procedure wspolrzedne(punkt: nowe\_xy) 6

Zadaniem metody współrzędna jest przypisanie wartości pól x, y rekordu nowe_xy polom x, y obiektu xy. W celu uniknięcia konمخiktu identyمحkatorów deمحnicja metody powinna być następująca: procedura xy.wspolrzedne(punkt: nowe\_xy); begin with punkt do begin Self.x:=x; Self.y:=y end Wystąpiłtuparametr Self,wskazującynato,że xiyzlewejstronyinstrukcji przypisania;sątowłasnepolaxiyobiektu(niepolarekorduxy),wktórymznajduje się metoda. Zaznaczyć należy, że jeśli nie używa się instrukcji wiążącej with to parametr Self nie jest konieczny. procedure xy.wspolrzedne(punkt: nowe\_xy); begin x:=punkt.x; y:=punkt.y; 7