Aspekty programowania obiektowego
Klasa - jest rozszerzeniem obiektowego typu danych, dla którego metody są ze sobą powiązane (współpracujące) wewnątrz niej samej.
Relacje miedzy klasami:
- dziedziczenie (forma wielokrotnego wykorzystania kodu) - nowe klasy tworzy się na podstawie istniejących klas : wchłania cechy i zachowania obiektu (klasy potomnej) dołączając je do własnej
- zastępowanie metod - przedefiniowanie odziedziczonych metod (dla metod public)
- podklasa dziedziczy od nadklasy
- bezpośrednia nadklasa - podklasa jawnie dziedzicząca
- pośrednia nadklasa - podklasa dziedziczy od dwóch albo więcej poziomów w gore (hierarchii klas)
Dostęp do modyfikacji:
- public
- private
- protected
Wprowadzenie dostępu chronionego (protected)
Relacje:
- „is” - dziedzictwo; obiekt podklasy „jest” obiektem nadklasy
- „has” - kompozycja; obiekt „zawiera” obiekt innej klasy jako członka
Biblioteki klas
- nowe klasy mogą dziedziczyć od siebie
- oprogramowanie może zostać zbudowane od standardowego, nadającego się do wielokrotnego użycia komponentów (jak sprzęt komputerowy)
- utworzy potężniejsze oprogramowanie
Użycie dziedziczenia
- pewne zachowania albo dane są wspólne między grupą klas a tworzą nową klasę
Relacje pomiędzy klasami
- klasa nadrzędna (nadklasa)
*człon public: dostępny gdziekolwiek program ma odniesienie do nadklasy albo do typu podklasy
*człon private: dostępny tylko w metodach nadklas
*człon protected: pośrednie zabezpieczenie pomiędzy członami public a private
*dostęp przez metody nadklasy i podklasy albo klasy w tej samej hierarchii
Obiekt podklasy
- może zostać potraktowany jako obiekt nadklasy- nie spełniony jest warunek odwrotności
- wiele klas może dziedziczyć od jednej nadklasy
- wybór odniesień nadklasy
- przetwarzanie wszystkich obiektów jako obiekty jednej nadklasy
Relacja miedzy klasami
- metody przełączające
*podklasa może przedefiniować metody nadklasy
*odwołanie się do konstruktora nadklasy
Constructor(); // jeśli wymagane to podać argumenty
* jeśli odwołanie jest jawne, musi być użyte jako pierwsze
- związek („know-a”) - relacja może zaistnieć pomiędzy dwoma klasami:
* jeśli metoda jednej klasy lub klas istnieje jako zmienna lokalna przykład innej klasy
* jeśli atrybuty jednej klasy są cechą innej klasy
- agregacja („has-as”) - relacja agregacji istnieje między dwoma klasami jeśli:
*pole jednej klasy jest składową innej klasy
*druga klasa jest częścią jednej klasy
- dziedzictwo („is-a”) - relacja dziedzictwa istnieje jeśli jedna klasa jest dziedzictwem innej klasy
Zakres dostępu
Poziom | klasa | podklasa | nie w klasie
Public | + | + | +
Protec | + | + | -
Priv | + | - | -
Mechanizm dziedziczenia
Grupowanie obiektów w systemach obiektowych
- w językach opisujących dziedzinę problemową przez prototyp (a nie klasy_. Występuje mechanizm delegacji
- dziedziczenie grupuje obiekty zgodnie z ich typami
- delegacja nie definiuje kategorii obiektów lecz umożliwia współdzielenie między dowolnymi obiektami
- system obiektowy oparty na dziedziczeniu oferuje klasy i obiekty
- system oparty na detekcji bazuje na jednym obiekcie łączącym w sobie cechy klasy i obiektu
Delegacja
- pozwala na stopniowe definiowanie obiektów w terminach innych obiektów
- pozwala na współdzielenie funkcji i zmiennych
* delegacja atrybutów funkcji lub zmiennych do innego prototypu, wymusza zmianę tych atrybutów ich wartości (dotyczy zarówno obiektu i prototypu)
* w ten sposób obiekty w hierarchii delegacji mogą być wzajemnie zależne:
**ponieważ w systemie opartym na delegacji nie ma grupowania
**dwa obiekty o różnych typach mogą delegować do tego samego prototypu
** podobnie jak dwa obiekty tego samego typu mogą delegować do różnych prototypów
Różnica pomiędzy klasycznym (opartym na klasach) a prototypowym podejściu dotyczy:
- wielowiekowej filozoficznej debaty odnoszącej się do statusu i reprezentacji abstrakcji
- według Platona abstrakcja (ideał) istnieje bardziej rzeczywiście niż przedmiot w rzeczywistym świecie
Język obiektowy (Smaltalk) nawiązuje do tych idei w sensie bezpośredniego użycia klas do reprezentowania podobieństwa wśród kolekcji obiektów. Klasyczne i prototypowe podejście języków obiektowych różni się w sposobie reprezentowania i współdzielenia abstrakcji.
Klasyczny język rozróżnia współdzielenie atrybutów klas przez:
-obiekty
-współdzielenie atrybutów nadklas przez klasy
-języki prototypowe posiadają jeden rodzaj współdzielenia - poprzez prototyp
Przykład klas w systemach opartych a delegacji:
- aktor
- prototyp
Grupowanie poprzez typy jest użyteczne
- dla kompilacji
- indeksowania baz danych
Mały rozmiar obiektów w modelach delegacji zwiększa szybkość działania systemu
W systemie dziedziczenia opartym na klasach nowe obiekty tworzone są poprzez odwołanie cech klasy do której należy.
W modelu delegacji nowe obiekty - prototypy tworzone są poprzez klonowanie czylu kopiowanie.
W systemie opartym na klasach żaden z obiektów nie jest samo wystarczalny:
potrzebny jest inny obiekt (klasa) aby opisał jego strukturę i zachowanie
W systemie opartym na prototypach obiekt (prototyp) zawiera swój własny stan behawioralny w związku z czym nie musi być zależny od innych obiektów.
System prototypowy pozbawiony dziedziczenia prowadzi do problemu:
- mianowicie każdy obiekt (prototyp) powinien zawierać wszystkie swoje stany
Rozwiązaniem umożliwiającym współdzielenie stanów behawioralnych dla rodziny obiektów jest wykreowanie obiektu, który zawiera wspólne stany dla kolekcji obiektów i podobnie jak to czyni klasa, z wyjątkiem informacji dotyczącej samej (siebie ;) - chyba)
Kierunki doskonalenia systemu dotyczą:
- współbieżności
- przetwarzania rozproszonego
Dziedziczenie wymaga strukturalnego współdzielenia zasobów. Współdzielenie wymaga niezależnego obiektów. Przetwarzanie rozproszone zwiększa autonomię procesów.
Podczas próby zastosowania przetwarzania rozproszonego przy wykorzystaniu mechanizmów dziedziczenia pojawi się niespójność:
- pomiędzy rozproszeniem i dziedziczeniem na skutek różnicy celów modularności i współdzielenia :
*modularność wymaga separacji pomiędzy komponentami
*współdzielenie wymaga fuzji komponentów
Cecha dziedziczenia zawiera:
- dziedziczenie strukturalne (dziedziczenie struktury klasy)
- dziedziczenie funkcjonalne (dziedziczy funkcję nadklasy)
Klasa obiektu opisuje swoją strukturę za pomocą zmiennych:
- zmienne podklasy muszą zachować ten sam typ informacji co zmienne nadklasy
- zmienne w hierarchii dziedziczenia są wzajemnie niezależne. Jeżeli typ podrzędny dziedziczy cechy typu nadrzędnego to każdy obiekt typu podrzędnego automatycznie zawiera jako część swojej reprezentacji, lokalne stany (zmienne) obiektu typu nadrzędnego
Podklasy nie mogą odwołać się do zmiennych nadklasy bezpośrednio. Zmienne nadklasy mogą być zmieniane jedynie za pomocą funkcji zdefiniowanych dla danej klasy.
Bardziej ogólnym podejściem, które łączy efektywność o elastyczność jest wprowadzenie notacji:
- public - private - visible
pozostawienie konkretnej implementacji by zapewnić wymaganą ochronę danych.
Klasa definiuje:
- strukturę
- zachowanie obiektu
- zachowanie obiektu jest określone za pomocą funkcji stowarzyszonych ze zmiennymi danej klasy
- funkcje są operacjami, za pomocą których dane mogą być pobierane o uaktualizowane
W hierarchii dziedziczenia funkcja definiowana dla danej klasy jest dziedziczona przez jego podklasę.
Dziedziczone funkcje są łącznikiem, za pomocą którego możemy obsługiwać dane podklasy.
Polimorfizm metod - operacja wywoływana przez komunikat może być różnie wykonywana, w zależności od rodzaju obiektu, od którego ten komunikat został wysłany.
Polimorfizm typów - polimorfizm w tzw. polimorficznych językach programowania oznacza istnienie procedur lub funkcji, które mogą zarówno przyjmować wartości wielu typów jako swoje argumenty, jak też i zwracać wartości wielu typów:
- przykładowo funkcja pobierz_pierwszy(lista) zwraca pierwszy element dowolnej listy, niezależnie od tego czy jest to lista liczb całkowitych, rzeczywistych czy lista rekordów.
Polimorfizm typów jest uważanych za podstawę
Polimorfizm metod jest szczegółowym przypadkiem polimorfizmu typów (obiekt, do którego jest wysyłany komunikat jest dodatkowym parametrem metody) nie jest zbyt przekonywujące
Polimorfizm parametryczny - rodzaj polimorfizmu typów, który oznacza, że typ bytu programistycznego może być parametryzowany innym typem, np. klasa:
- wektor(int)
- wektor(char)
Polimorficzne języki programowania (HL,Quest, Napier88) nie muszą być obiektowe, ale mogą być.
W środowisku LabView polimorfizm występuje w:
-operacjach na tablicach
-operacjach porównań
-operacjach na łańcuchach
-operacjach typu numerie
Typ wyjścia funkcji arytmetycznych jest taki sam jak typ wejścia. Dla funkcji z jednym wejściem, funkcje operują na każdym elemencie struktury. Dla funkcji z dwoma wejściami należy użyć następujących wejściowych kombinacji:
- wejścia podobne -> taka sama struktura na wyjściu
- jedna jest skalarem (skalar + tablica -> tablica)
- tablica + tablica -> tablica
obiekt - struktura danych występująca łącznie z operacjami dozwolonymi do wykonania na niej, odpowiada bytowi wyróżnianemu w rzeczywistości.
Tożsamość obiektów - wewnętrzny identyfikator, który pozwala na odróżnienie go od innych obiektów
Hermetyzacja - rozróżnienie pomiędzy interfejsami obiektu opisującym co obiekt robi, a implementacją definiującą jak jest zbudowany i jak robi to co ma robić
Dziedziczenie - wielokrotne użycie tego co wcześniej zostało zrobione: zdefiniowanie klas, które mają wszystkie cechy zdefiniowane wcześniej (z nadklasy) plus cechy nowe
Polimorfizm - wybór nazwy dla operacji jest określony wyłącznie z semantyką operacji. Decyzja o tym która metoda implementuje daną operację zależy od przynależności obiektu do odpowiedniej klasy
===============================
17. XI
<<<< tutaj jest fajny obrazek z 6 jpega...
Podstawowe klasy:
- TObject
- TComponent
- TGraphicsControl, TWinControl
- TForm
- TApplication
- TException
Komponenty niewizualne:
- wywodzą się z klasy TComponent
- nie są widoczne dla użytkownika w czasie działania aplikacji
- zmiana działania i parametrów aplikacji jest możliwa na etapie powstawania kodu źródłowego
- przykład: Ttimer, Ttable, TOpenDiag
Komponenty wizualne
- wywodzą się z klasy TControl
- są widocznymi dla użytkownika elementami interfejsu użytkownika, przy czym niekoniecznie muszą wykazywać przejaw interakcji z użytkownikiem
- klasa TControl definiuje własności bezpośrednio związane z geometria: Tcontrol , Top, Left, Width, Height
Komponenty
- komponent jest samodzielnym binarnym fragmentem oprogramowania, które jest w stanie wykonać predefiniowane funkcje
- przykłady: Text, Label, Edit, ListBox
Komponent a kontrolka
- kontrolka jest widzialnym elementem intefejsu użytkownika, natomiast komponent jest każdym obiektem, który może pojawić się w palecie komponentów i którego właściwościami można operować na etapie projektowania
- każda kontrolka wywodzi się w Delphi z klasy TControl będącej z kolei pochodną klasy TComponent - tak więc każda kontrolka jest jednocześnie komponentem, nie każdy komponent jest jednak kontrolką
===============================
07.10.2004
Podstawowe aspekty programowania
- kontrolowanie
- nauczanie
- proces obliczeniowy zadanego problemu
- kreatywność - należy dobrać najlepsze rozwiązanie
- modelowanie - przedstawienie w abstrakcyjnej formie
- abstrakcja - wyselekcjowanie ważnych szczegółów
Program
Model złożonego systemu:
- Model: zespolony fragment danego systemu reprezentujący szczególnie istotne szczegóły rzeczywistości w abstrakcie opisującym
- system: kolekcja komponentów synchronicznie ze sobą współpracujących
Specyficzne odzwierciedlenia poszczególnych sekwencji w języku programowania
- skladnia - formułowanie ciągu instrukcji ściśle określonych reguł gramatycznych
- semantyka - rozumienie (interpretacja) zadanych instrukcji
Instrukcje wypisane przez programistę
-zaimplementowane w konkretnym języku programowania
-język programowania wymaga pracy opisu niż język komunikacji międzyludzkiej
Warstwy środowiska:
- warstwa systemu operacyjnego
- warstwa aplikacji
===============================
10.11.2004
Inspektor obiektów
inspektor obiektów posiada dwie zakładki:
properties (własności)
Events (zdarzenia)
- własności komponentu kontroluje jego wygląd i działanie
- zakładki Eventrs zawiera listę zdarzeń charakterystycznych dla komponentów
- zdarzenie
Programowanie oparte o kolejność instrukcji lub o zdarzenia
Flow driven - kolejność instrukcji
- typowe programy tekstowe
- instrukcje wykonywane są kolejno( z przeskokiem jeśli instrukcja warunkowa)
- użytkownik wprowadza dane na żądanie programu
Even driven - zdarzeniowe
- typowe programy zdarzeniowe
- nie można przewidzieć kolejności wykonywania
- instrukcje są wykonywane w odpowiedzi na akcje użytkownika lub akcje zachodzące w programie lub systemie
Co to jest zdarzenie
Event - jest to mechanizm łączący jakieś zdarzenie (occurence) wewnętrzne lub zewnętrzne z wykorzystaniem fragmentu kodu
zdarzenie -> mechanizm zdarzenia -> obsługa zdarzenia
Procedura obsługi:
- zdarzenia są obsługiwane przez procedury wskazywane przez odpowiednie własności komponentu (properties)
- jeśli własność wskaźnika (np. onClick) do obsługi zdarzenia jest różna od nil to zostaje wywołana procedura wskazana przez wskaźnik
- zawiadomienie:
*istnieje -parametrem jest komponent w którym zostało zdarzenie
*brak - nie ma mechanizmu zwrotnego (no feedback)
TNotyfiEvent
OnClick
Procedure Tform1.Button1Click(Sender: TObject1);
Begin {kod źródłowy}
End;
- OnClick jest wskaźnikiem do procedury typu TNotyfiEvent
- Tform1.ButtonClick jest procedura na którą „wskazuje” wartość OnClick
Komponenty jako właściciele innych komponentów:
interpretacja relacji własności:
każdy komponent w czasie swej destrukcji zobowiązany jest zwolnić wszystkie komponenty, których jest właścicielem:
- TB_Przycisk = Tbutton.Create(self);
przykład obiektu osieroconego
TT_Dane = Ttable,Create(nil);
Try ....
finally
TT_Dane.Free;
End;
Wybrane klasy komponentów i ich własności
- TPersistent
klasa bazowa dla wszystkich klas zdolnych do przechowywania w strumieniach zawartości swych obiektów
ważniejsze metody:
Assign() - dokonuje kopiowania zawartości pomiędzy dwoma obiektami tej samej klasy
DefineProperties() - definiuje sposób zapisu właściwości do strumienia
- TComponent
wywodzi się z niej każdy komponent w Delphi
ważniejsze właściwości
Owner - zawiera wskaźniki komponentu właściciela
ComponentCount - zazwiera liczbę zawłaszczonych komponentów
Components = tablica wskazań na zawłaszczone komponenty
Name - unikalna nazwa komponentu
Tag - pole pomocnicze, bez określonego przeznaczenia
ważniejsze metody:
*constructor Create(Aownet: TComponent);virtual;
MyEdit:=FindComponent(`Ed_tekst');
If MyEdiy is Tedit then
Tedit(MyEdit).text = `Okno edycyjne';
*HasParent
*GetParent
- TControl
reprezentuje komponenty wizualne(kontrolki)
- TWinControl
klasa bazowa dla okienkowych kontrolek
-TGraphicsControl
klasa nieaktywnych kontrolek graficznych
- TCustom
klasy bazowe dla potrzeb tworzenia nowych komponentów, np.. TcustomControl, TCcustonEdit
- TCanvas
wiele kontrolek posiada własność Canvas wskazująca na obiekt zwany płótnem i realizującym wszelkie operacje graficzne.
Zestaw własności klasy:
METODA |
TYP WYNIKU |
ZNACZENIE |
ClassName |
String |
Nazwa klasy |
ClassType |
TClass |
Klasa obiektu |
InhertisFrom |
Boolean |
Test przynależności do klasy lub pochodnych |
ClassParent |
TClass |
Klasa macierzysta w stosunku do klasy obiektu |
InstancesSize |
Word |
Rozmiar obiektu w bajtach |
Classinfo |
Pointer |
Wskaźnik do struktury RTTI (Run Time Type Information) |