Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie Komputerów

Podobne prezentacje


Prezentacja na temat: "Programowanie Komputerów"— Zapis prezentacji:

1 Programowanie Komputerów
prowadzący dr Grzegorz Filipczyk

2 Programowanie zorientowane obiektowo (ang. Object Oriented Programming)
Programowanie, w którym typy stanowią najważniejszą część w konstrukcji programu. Typ rozumiany jest jako zbiór obiektów i operacji na tych obiektach. Program końcowy jest zbiorem obiektów oddziaływujących i porozumiewających się między sobą. Obiekt - struktura o ustalonej liczbie składników, z których każdy jest albo polem zawierającym dane określonego typu, albo metodą, która może wykonywać operacje na zdefiniowanych polach.

3 Język Pascal jako język programowania obiektowego
Programowanie obiektowe pojawiło się już w języku Turbo Pascal od wersji 6.0. Bezpośrednim powodem była chęć uporządkowania prac nad nowymi wielkimi systemami software'owymi realizowanymi przez liczne zespoły programistów. Aby uniknąć niezgodności i umożliwić selektywną aktualizację wybranych podsystemów, stworzono pojęcie obiektu, jako struktury łączącej i dane i podprogramy lub funkcje. Szybko jednak programowanie zorientowane obiektowo stało się nową filozofią programowania.

4 Język Pascal jako język programowania obiektowego
Przełom należy szczególnie do zjawiska które nazwano polimorfizmem - wielopostaciowość. Umożliwia ono użytkownikowi - programiście zmieniać działania procedur w programie napisanym wcześniej przez innego programistę. W technice programowania obiektowego zostały w języku Turbo Pascal napisane biblioteki Turbo Vision i Object Windows. Wprawdzie opanowanie tych bibliotek było trudne i czasochłonne, to jednak później umożliwiały szybkie pisanie nawet bardzo złożonych programów.

5 Środowisko Borland Delphi
Środowisko Borland Delphi jest już wyłącznie środowiskiem OOP - programowania zorientowanego obiektowo. Bazuje ono na analogicznych bibliotekach programowania obiektowego, upraszczających i przyspieszających znakomicie pisanie programów. Delphi, w ułatwianiu procesu programowania idzie dalej niż Borland Pascal - w przypadku programów nieskomplikowanych programista nie musi nawet w systemie Borland Delphi poznawać struktury predefiniowanych klas, obiektów oraz ich pól i metod. Jedynie bardzo już zaawansowane programowanie, np. tworzenie własnych lub modyfikacja istniejących komponentów, wymaga znajomości struktur klas.

6 Obiekt, w rozumieniu języka Borland Pascal
Obiekt, w rozumieniu języka Borland Pascal (w Delphi operujemy pojęciem klasy, jednak nadal pojęcie obiektu jako typu jest dopuszczone, choć niezalecane), składa się z pól oraz metod. Polem nazywamy dowolną strukturę danych z wyjątkiem pliku dyskowego. Metoda jest procedurą lub funkcją. Metody działają na danych określonych w polach. Wskazane jest aby całość danych potrzebnych do określenia i działania obiektu była częścią składową tego obiektu. Nie zaleca się wykorzystywania tych danych poza obiektem, a jedynie wewnątrz, przez własne metody obiektu.

7 Cechy obiektów Obiekt posiada następujące trzy fundamentalne cechy:
hermetyzacja, nazywana inaczej enkapsulacją. Dane i kod (pola i metody) są organiczną jednością decydującą o zachowaniu się obiektu; tylko wybrane aspekty tego zachowania widoczne są dla innych obiektów; dziedziczenie. Mając dany obiekt (przodka), możemy na jego bazie stworzyć obiekt pochodny (potomka), który będzie wzbogacony o nowe elementy w stosunku do swojego pierwowzoru i/lub będzie zachowywał się w sposób zmodyfikowany. Pola i metody obiektu - przodka zostają wykorzystane, bez potrzeby programowania analogicznych pól i metod obiektu - potomka; polimorfizm. W ciągu dziedziczenia, od najstarszego przodka do najmłodszego potomka, można wyróżnić określoną cechę, która będzie przyjmować wiele form (postaci) uzewnętrzniania się. Przetwarzając obiekt - potomka, można, dzięki polimorfizmowi, modyfikować działanie metod przodka, nawet wówczas gdy kod źródłowy tych metod nie jest dostępny.

8 W Borland Delphi W Borland Delphi operujemy typem obiektowym, który nazywa się klasą (class). Obiektem natomiast (object) nazywamy jedną z wielu możliwych realizacji (instances) danej klasy. Obiekt, czyli realizacja klasy, jest to dynamicznie alokowany blok pamięci operacyjnej, którego rozmiar i struktura określona jest przez jego klasę. Zmienną typu klasa jest natomiast wskaźnik (pointer), wskazujący na związany z nim obiekt (ściślej na początek bloku pamięci operacyjnej zajmowanego przez obiekt; obiekt jest natomiast zmienną dynamiczną lub inaczej tzw. wskazywaną).

9

10 Klasa Klasa to struktura łącząca pola (fields), metody (methods) oraz właściwości (properties). Pole to zmienna, będąca elementem obiektu. Jest to pojęcie analogiczne do pola rekordu. Metoda jest to procedura lub funkcja związana z klasą. Właściwość jest to wielkość definiująca jeden z atrybutów obiektu. Wartość danej właściwości jest zwykle przechowywana w jednym z pól obiektu. Właściwość posiada klauzule dostępu (access specifiers), które określają jak dana właściwość jest odczytywana i/lub modyfikowana.

11 Deklaracja klasy ma postać następującą
type ClassName = class (AncestorClass) MemberList end; gdzie: ClassName - nazwa klasy; AncestorClass - nazwa klasy - przodka w stosunku do danej klasy; MemberList - lista członów klasy.

12 Elementy deklaracji klasy
AncestorClass jest to element opcjonalny. Jeśli nie zostanie podany, to przyjmuje się, że przodkiem danej klasy jest klasa TObject, będący najstarszym przodkiem wszystkich klas w Delphi. MemberList jest to lista wszystkich członów danej klasy. Pod pojęciem członów rozumie się pola, metody i właściwości, czyli elementy danej klasy

13 Klasy w Delphi Klasy w Delphi stanowią rozbudowane drzewo dziedziczenia. Każdy komponent w Delphi jest klasą. Przykładowo: komponent MainMenu (główne menu aplikacji) w Delphi 7 jest klasą o nazwie TMainMenu, która dziedziczy pola, metody i właściwości w ciągu dziedziczenia klas: TObject - TPersistent - TComponent - TMenu - TMainMenu Szczegóły tego ciągu można studiować zaznaczając dany komponent, wywołując Help poprzez Ctrl-F1 oraz wybierając opcję Hierarchy, a następnie nazwy poszczególnych klas. Nie jest to jednak konieczne, można bowiem, pisząc średnio zaawansowane aplikacje, wykorzystywać każdy komponent, nie interesując się jego miejscem w strukturze klas środowiska.

14 Ważniejsze typy w hierarchii klas

15 Dziedziczenie i pokrywanie się członów klas
W momencie deklarowania klasy, możliwe jest wskazanie jej przodka (ancestor). Dana klasa stanie się wówczas potomkiem (descendant), który będzie dziedziczyć od przodka wszystkie człony tj. pola, metody i właściwości. Można zadeklarować nowe dodatkowe człony. Ich zasięg ważności będzie sięgał od miejsca deklaracji i rozciągać się na bloki wszystkich metod danej klasy i na wszystkich potomków danej klasy. Jeśli zadeklaruje się u potomka nowe człony o tych samych nazwach jak u przodka, to nowe człony pokryją (przysłonią) analogiczne człony przodka, jednak nie zlikwidują ich. Będą one nadal dostępne, ale pod warunkiem ich jawnego wywołania, to znaczy wraz z poprzedzającą nazwą przodka.

16 Widoczność W Delphi każdy człon klasy cechuje się zasięgiem swojej widoczności przez inne elementy aplikacji (visibility). Istnieją następujące klauzule widoczności członów klas: private (prywatne) protected (chronione) public published (publikowane) automated (automatyczne)

17 private (prywatne) Człony tego typu są widoczne jedynie wewnątrz modułu, w którym znajduje się deklaracja klasy;

18 protected (chronione)
Człony tego typu są widoczne jedynie wewnątrz modułu, w którym znajduje się deklaracja klasy, a także przez wszystkich potomków danej klasy;

19 public (publiczne) Człony tego typu są widoczne przez wszystkie moduły aplikacji, które widzą deklarację danej klasy;

20 published (publikowane)
Człony tego typu są widoczne przez wszystkie moduły aplikacji, które widzą deklarację danej klasy. Dodatkowo kompilator wydaje i udostępnia szczegółowe informacje o tych członach. Informacje te nazywają się RTTI - Runtime Type Information. Są one dostępne w czasie wykonywania aplikacji, a także wykorzystywane przez inspektora obiektów (Object Inspector);

21 automated (automatyczne)
Człony tego typu są widoczne przez wszystkie moduły aplikacji, które widzą deklarację danej klasy. Dodatkowo kompilator wydaje i udostępnia specjalną informację o tych członach wymaganą przez serwery automatyzacji COM. Klauzula przestarzała, zachowana ze względów kompatybilności.

22 Brak jawnej klauzuli widoczności
Człony zadeklarowane w początkowej części deklaracji klasy, dla których nie podano w sposób jawny klauzuli widoczności są standardowo traktowane jako published, pod dodatkowym warunkiem, że aplikacja jest skompilowana z dyrektywą kompilatora {$M+}. W przeciwnym razie są traktowane jako public.

23 Pole Pole jest podobne do zmiennej należącej do danego obiektu. Pole może być dowolnego typu, włączając tu także klasę (to znaczy, że klasa może być zagnieżdżona w klasie). Pola mają zazwyczaj przypisaną klauzulę private widoczności. Deklaracje pól muszą poprzedzać deklaracje metod i właściwości.

24 Przykład deklaracji pola
type TNumber = class {klasa TNumber dziedziczy człony od TObject} Int: integer; end;

25 Pokrywanie pól Pola w Delphi mogą być pokrywane (przysłaniane), to znaczy pole o tej samej nazwie u potomka pokrywa (przysłania) pole przodka.

26 Przykład pokrywania pól
type TAncestor = class {klasa TAncestor dziedziczy człony od TObject} Value: integer; end; TDescendant = class(TAncestor) {klasa TDescendant dziedziczy człony od TAncestor} Value: string; {pole Value pokrywa pole Value klasy TAncestor} var MyObject: TAncestor; {MyObject jest zmienną typu TAncestor} begin MyObject:=TDescendant.Create; {fizyczne utworzenie zmiennej MyObject} MyObject.Value:='Hello'; {błąd} MyObject.Value:=3; {instrukcja poprawna} (MyObject as TDescendant).Value:='Hello'; {instrukcja poprawna}

27 Komentarz W przykładzie, jakkolwiek MyObject jest realizacją klasy TDescendant, jest jednak deklarowane jako typu TAncestor. W związku z tym kompilator interpretuje MyObject.Value jako typu integer. Oba rodzaje pól istnieją jednak, w związku z dziedziczeniem, w klasie TDescendant, i są osiągalne przez jawne wskazanie - wybór klasy (typecast) operatorem as. Gdyby MyObject został zadeklarowany jako typu TDescendant (var MyObject: TDescendant;), to instrukcja (MyObject.Value:='Hello';) byłaby poprawna w efekcie pokrywania pola.

28 Metody Wewnątrz deklaracji klasy umieszcza się deklarację metody, to znaczy funkcji lub procedury. Nie jest to jeszcze definicja, to znaczy pełny tekst (ciało) metody. Definicja metody musi zostać przytoczona później. Deklarację klasy wraz z deklaracją metod umieszcza zwykle w części publicznej modułu za słowem kluczowym interface (choć można to zrobić też w części implementacyjnej modułu za słowem kluczowym implementation). Definicje metod muszą być umieszczone wyłącznie w części implementacyjnej modułu.

29 Przykład interface ............................................. type
TMyClass = class procedure DoSomething; end; implementation procedure TMyClass.DoSomething; begin

30 Deklaracja metod W deklaracji metody umieszcza się pełny nagłówek metody wraz z listą parametrów formalnych (jeśli metoda ją posiada) i typem zwrotnym (dotyczy funkcji), natomiast w definicji metody wystarczy podać nazwę metody, ale z poprzedzającą nazwą klasy oddzieloną kropką bez listy parametrów. Jeśli jednak listę parametrów formalnych metody i typ zwrotny (dotyczy funkcji) się powtarza, to muszą być one identyczne jak w deklaracji. Deklaracje metod mogą być zaopatrzone w specjalne dyrektywy funkcji lub procedury: reintroduce, overload, binding (w tym: virtual, dynamic, override), calling convention (w tym: register, pascal, cdecl, stdcall, safecall), abstract oraz warning (w tym: platform, deprecated, library). Nazwy wyprowadzone kursywą są to nazwy grup dyrektyw a nie samych dyrektyw (nazwy dyrektyw wyprowadzono boldem).

31 Dziękuję za uwagę


Pobierz ppt "Programowanie Komputerów"

Podobne prezentacje


Reklamy Google