Języki i paradygmaty programowania – skrót
Paradygmat – wzorzec
Paradygmat programowania – zbiór koncepcji reprezentujących podejście do implementacji algorytmu, zbiór mechanizmów programistycznych wykorzystywany przez programistę i mający wpływa na wykonywanie programu przez komputer, ogół oczekiwań wobec języka programowania i komputera
Język programowania – język formalny służący do komunikacji użytkownika z komputerem (wydawania poleceń), składających się z określonych słów kluczowych i symboli
Język programowania jest definiowany przez syntaktykę i semantykę, czyli reguły określające jakie wyrażenia się stosuje i jakie jest są ich funkcje.
Syntaktyka to składnia, określa jak się tworzy polecenia, jak wyglądają struktury sterowania i deklaracje
Język to zbiór napisów ze znaków danego alfabetu
Do opisu składni języków wykorzystuje się gramatyki bezkontekstowe, zazwyczaj też notację (E)BNF
pętla-dopóki ::= "while" "(" wyrażenie ")" instrukcja
Semantyka – znaczenie form, czyli co one robią
Występuje 5 generacji języków programowania, w zależności od stopnia ich złożoności
Programowanie imperatywne – ciąg poleceń dla komputera wykonywanych jedno po drugim sekwencyjnie
Abstrakcją komórek pamięci są zmienne.
Programowanie proceduralne – podział zadania na podzadania i ich niezależna implementacja
Programowanie strukturalne – używanie prostych struktur, unikanie skoków
Programowanie obiektowe – połączenie danych i operacji na nich w całość – obiekty, kolejne cechy to dziedziczenie, inkapsulacja, polimorfizm, wysoki stopień abstrakcji danych
Programowanie funkcyjne – program to złożona funkcja matematyczna, brak pętli, zmiennych, brak stanu maszyny, programy to składane funkcje, zazwyczaj istotne wykorzystanie rekurencji, wynikami funkcji mogą być funkcje
Programowanie logiczne – podstawową koncepcją są predykaty, czyli coś co trzeba udowodnić, wykonanie programu to próba udowodnienia w oparciu o przesłanki
Paradygmat programowania równoległego i rozproszonego – rozdział procesu na wiele procesorów/maszyn dodanie mechanizmów synchronizacji i współdzielenia
Programowanie skalarne/wektorowe – operacje na zmiennych skalarnych/macierzach
Programowanie zdarzeniowe
Programowanie aspektowe
Wzorce projektowe – opisują najczęstsze problemy i ich rozwiązania
Wzorce konstrukcyjne – informują o najlepszych metodach uzyskiwania instancji obiektów
Wzorce strukturalne – opisują sposoby łączenia klas/obiektów
Wzorce czynnościowe – definiują komunikację pomiędzy obiektami oraz kontrolują przepływ danych
Uml – język modelowania rzeczywistości, diagramu UML ułatwiają i ujednolicają sposób komunikachi pomiędzy współtwórcami systemu, niezależne od języka i platformy
Diagramy struktury – statyczna część ssytemu
Diagramy zachowania – dynamiczna część systemu
Translator – program umożliwiający wykonanie programu w języku innym niż maszynowy, tj. kompilator i interpreter
Język pseudokodu – język używający zarówno kompilacji jak i interpretacji, kod tłumaczony jest na pseudokod (forma binarna), np. Java
Zmienna ma 6 atrybutów:
Nazwę
Adres (l-wartość)
Wartość (r-wartość)
Typ (zbiór dopuszczalnych wartości, wiążą się z nim również operacje)
Okres życia
Zakres widoczności
Wiązanie – połączenie zmiennej z którymś atrybutem (jego wartością)
Wiązanie statyczne – następuje przed wykonaniem programu, zazwyczaj w trakcie kompilacji
Wiązanie dynamiczne – następuje w trakcie działania programu, może się zmieniać w trakcie działania programu
Typ zmiennej jest zazwyczaj deklarowany jawnie, może być też niejawnie, np. poprzez wnioskowanie, pierwsze użycie lub na podstawie nazwy (pierwsza litera).
Zgodność typów jest sprawdzana dynamicznie
Alokacja pamięci – pobranie bloku pamięci i związanie ze zmienną
Dealokacja – zwolnienie bloku pamięci
Okres życia zmiennej – czas pomiędzy alokacją, a dealokacją
Zmienne dynamiczne na stosie – zmienne które są wiązane z pamięcią w momencie napotkania na ich deklarację
Zmienne dynamiczne na stercie, jawne – alokowane przez programistę poprzez malloc/New, dealokowane jawnie lub poprzez mechanizm odświecania, bez nazwy, dostępne poprzez referencję/wskaźnik
Zmienne dynamiczne na stercie, niejawne – alokowane/dealokowane przy podstawianiu
Zakres widoczności zmiennej – obszar kodu, której można się odwołać do zmiennej
Zakres widoczności != okres życia
Zmienna lokalna – zmienna zadeklarowana w danym fragmencie kodu
Zmienna nielokalna – zmienna widoczna w danej jednostce, ale zadeklarowana poza nią
Zmienna globalna – zmienna widoczna w całym programie
Zakres statyczny widoczności – opiera się na kodzie źródłowym, kompilator szuka w obrębie jednostki, jeśli nie ma to w jednostce wyższej itd., zmienne mogą się przesłaniać
Zakres dynamiczny widoczności – opiera się na przebiegu wykonania programu, przy napotkaniu odwołania szukana jest deklracja na podstawie ostatnio wykonywanych bloków, szukanie jest w jednostce, jeśli brak to w jednostce która ją wywołała, zmienne mogą się przesłaniać
Typ – zbiór dopuszczalnych wartości, z typem wiąże się zbiór operacji dopuszczalnych
Zgodność typów – typy operandów muszą się zgadzać z typami wymaganymi przez operatory
Dla unii sprawdzanie zgodności tylko dynamiczne, w pozostałych przypadkach sprawdzanie takie jak rodzaj wiązania
Języki słabo typowane – oferują niejawne konwersje typów
Języki silnie typowane – wychwytują różnice typów – błędy typów
Zgodność nazwy typu – dwie zmienne są zgodne, jeśli w deklaracji użyto tej samej nazwy typu
Zgodność struktury – 2 zmienne są zgodne, jeśli mają taką samą strukturę (budowę)
Mechanizm podtypów – dany typ ma podtypy zgodne z typem nadrzędnym i innymi podtypami
Mechanizm typów pochodnych – typów będących niezależnymi, niezgodnymi typami
Typ pierwotny – typ którego nie da się zdefiniować za pomocą innych
Typ prosty – składający się z jednego typu pierwotnego
Typ złożony – typ składający się z wielu typów prostych
Rekord/struktura – iloczyn kartezjański typów składowych
Tablica – iloczyn kartezjański egzemplarzy tego samego typu
Ty wyliczeniowy – typ zawierający uporządkowany zbiór wskazanych elementów
Podtyp – to podzbiór typu
Typ pochodny – ten sam zbiór ale o innej nazwie
Typ abstrakcyjny – konstrukcja, której definiowany jest typ oraz operacje na nim, ważne jest oddzielenie części prywatnej (implementacji) od publicznej (interfejsu) – inkapsulacja
Typy napisowe – pierwotne/tablicowe/specjalne tablicowe, mogą być o stałej długości, zmiennej o stałym ograniczeniu, zmienne dowolnie (stałe to takie, że nie można zmieniać długości)
Typy tablicowe – zestaw elementów tego samego typu, dostęp przez indeksowanie (wyliczanie adresu), wymiar może być stały statyczny, stały dynamiczny oraz zmienny dynamiczny
Typ asocjacyjny – zbiór par uporządkowanych (klucz, wartość), dynamiczne
Rekord/struktura – zestaw elementów różnych typów
Unie – zestaw pól różnych typów z fizycznym przechowywaniem tylko jednego
Typ wskaźnikowy – obejmuje wartości wskazujące na inne wartości, technicznie adresy w pamięci
Podprogram – abstrakcja czynności, część programu wykonująca daną funkcję
Definicja podprogramu – sposób komunikowania się z otoczeniem oraz sposób działania
Nagłówek podprogramu – mówi o tym, że fragment kodu po nim jest definicją, przez podanie nazwy i parametrów mówi o sposobie komunikowania się
Sygnatura podprogramu – jest to liczba, porządek i typ parametrów formalnych
Protokół podprogramu – opis parametrów formalnych i typ wyniku
Deklaracja/prototyp podprogramu – określenie protokołu bez podania definicji
Parametry formalne – parametry w nagłówku
Parametry aktualne – parametry przy wywołaniu
Procedury, a funkcje – procedury definiują nowe instrukcje, a funkcje nowe operatory
Zgodność typów parametrów nie jest sprawdzana przez JavaScript, Perl i PHP, w C/C++ można wymusić brak sprawdzania zgodności poprzez stworzenie nagłówka z wielokropkiem.
Parametry mogą być w trybach: in, out, in-out (pobieranie i wyprowadzanie danych)
Przekazywanie danych:
Poprzez wartość (operacja na kopii)
Pośrednio, np. przez wskaźnik (operacja na oryginalnych danych)
Implementacja przekazywania danych:
Przez wartość
Przez wynik (przed wyjściem wartość jest przesyłana do parametru aktualnego z formalnego)
Przez wartość i wynik
Przez referencję
Przez nazwę (parametr aktualny jest wstawiany tekstowo w miejsce parametru formalnego)
Przez zmienną (może znaczyć przez referencję, może przez nazwę, niejednoznaczne)
W Perl wszystkie parametry aktualne są umieszczane w predefiniowanej tablicy @_
Podprogramy mogą być parametrami
Wiązanie płytkie – jeśli wykonywany podprogram będzie używał środowiska instrukcji wywołującej podprogram
Wiązanie głębokie – jeśli podprogram będzie używał własnego środowiska
Wiązanie ad hoc – jeśli podprogram będzie używał środowiska instrukcji która przekazała podprogram jako parametr
Polimorfizm podprogramów – kilka wersji danego podprogramu, różniących się sygnaturami
W programowaniu obiektowym występuje dynamiczne wiązanie wywołań metod z ich definicjami
Podklasa – klasa zdefiniowana przez dziedziczenei z innej klasy
Metoda – podprogram na obiektach klasy
Komunikaty – odwołania do metod
Protokół komunikatów obiektu – zbiór wszystkich metod danego obiektu
Obiektówka by Homer:
Pojęcie obiektu, od strony naukowej:
-Obiekt jest abstrakcją czegoś w dziedzinie problemu, odzwierciedlającą zdolność systemu do przechowywania informacji o tym, interakcji z tym czymś lub obie te rzeczy.
-Obiekt to kapsułka z wartościami atrybutów i wyłącznie na nich działającymi usługami.
Rózniaca między widzeniem obiektowym a proceduralnym:
Obiektowe | Proceduralne |
---|---|
-Projektant wychodzi od obiektów i problemów świata rzeczywistego starając się użyć dostępnych środków informatycznych w celu ich odwzorowania. Inżynieria wiedzy. | Możliwości maszyny i języka programowania są nadrzędne w stosunku do dokładnego uchwycenia istoty problemu. Inżynieria kodu |
-Dziedziczenie klas pozwala na naturalną generalizację (specjalizację) pojęć. | -Brak mechanizmów pozwalających na generalizację (specjalizację) |
-Systemy są elastyczne, podatne na rozszerzenia i zmiany dzięki hermetyzacji, dziedziczeniu i polimorfizmowi | -Brak naturalnych mechanizmów wspierających zmiany i rozszerzenia |
-Ponowne użycie jest podstawowym mechanizmem tworzenia nowych rozwiązań | -Każdorazowo znaczące części systemu tworzone są od podstaw |
-Towarzyszące obiektom technologie komponentów rozszerzają możliwości ponownego użycia i modularnej budowy systemu | -Biblioteki statyczne i dynamiczne, a także moduły charakterystyczne dla konkretnego języka lub środowiska programowego |
Podsumowanie: Technologia obiektowa w censtrum zainteresowania stawia modelowany problem ze świata rzeczywistego oraz jego uczestników i dobiera do nich odpowiednie środki informatyczne podczas gdy proceduralna odwrotnie, przede wszystkim uwzględnia możliwości komputera. |
KLASA: - abstrakcja kilku obiektów;
Dla twórcy systemu informatycznego klasa to pewien opis .Klasa wzbogacona o pewne podstawowe informacje zamienia się w konkret- obiekt. Obiekty nazywane są instancjami (egzemplarzami) klas. Z punktu widzienia programowania klasa to typ, obiekt to zmienna tego typu. Istnieje analogia pomiędzy klasą, a strukturą danych wzbogaconą o funkcje (analogia użyteczna, ale nieco zwodnicza). Klasa to uogólnienie dla podobnych do siebie obiektów z danej dziedzinie, a nie worek, w którym gromadzimy w luźny sposób powiązane ze sobą dane i funkcje.
DZIEDZICZENIE:
To mechanizm pozwalający na generalizację (specjalizację) i ponowne użycie.
Klasa dziedzicząca jest rodzaju klasy bazowej.
Pierwsza odziedzicza wszystkie cechy drugiej.
Klasa dziedzicząca będzie mogła udawać klasę bazową.
DZIEDZICZENIE WIELOKROTNE:
Dobra decyzja, gdy dziedziczymy klasy z różnych dziedzin zastosowania systemu
Zła decyzja, gdy dziedziczymy z klas z tej samej dziedziny zastosowań (np. Kształt i Powierzchnia)
Dziedziczenie wielokrotne stosujemy wówczas, gdy jest to bezwzględnie konieczne
POWIĄZANIA:
powiązanie określa stan, gdy dwie klasy w sposób dość niezależny i suwerenny są ze sobą skojarzone.
Zależność między obiektami musi być odzwierciedlona i jest reprezentowana pomiędzy ich klasami.
Zatem tam, gdzie obiekty będą powiązane, tam też istnieją powiązania pomiędzy klasami.
Ale nie w drugą stronę, gdyż powiązanie pomiędzy obiektami może być czasowe (powiązanie opcjonalne)
ZŁOŻENIE:
Ze złożeniem (agregacją) mamy do czynienia, gdy jeden obiekt jest częścią innego
Złożenie, a powiązanie:
Złożenie występuje tam, gdzie mamy do czynienia z relacją całość-część.
Złożenie różni się od powiązania:
- antysymetrią
- trwałością
przechodniością
CECHY ZALEŻNOŚCI:
Uściśleniu zależności służy liczność i szeregowanie
Każdą ze stron zalezności określa się w jednej z 5 liczości:
- dokładnie jeden
- wiele (zero lub więcej)
- opcjonalna (zero lub jeden)
- jeden lub więcej
konkretna liczba (lub zakres)
Dodatkową cechą zależności jest to czy jest ona uszeregowana, czy nie.
Szeregowanie stosuje się, gdy ważna jest kolejność obiektów w zależnośc
Przypadkiem uszeregowania zależności jest zdefiniowanie klucza dostępu do
niej np. poprzez indeksowanie bazy danych (wartość indeksu = klucz)
Jeśli liczność danej zależności pomiędzy klasami zdefiniowana jest w sposób niekonkretny (wiele, jeden lub więcej) to oznacza, że poszczególne obiekty mogą mieć różną konkretną ilość.
SZCZEGÓLNE RODZAJE ZALEŻNOŚCI:
Zależność opisana przez klasę:
dziedzina problemu przynosi więcej wiedzy na temat relacji niż tylko liczność i szeregowanie oraz jakie klasy stoją po obu jej stronach- wszystkie te cechy proszą się o własną klasę
Zależność opisana przez atrybut:
Przykład- klucz haszujący umożliwiający efektywny dostęp do elementu na podstawie jakiejś wartości źródłowej (wartość klucza = atrybut powiązania)
Zależność potrójna:
Przykład: student (wielu), przedmiot (jeden), wykładowca (jeden)
Inne przykłady zależności:
Kolejka, lista- relacja między strukturą danych i jej elementem jest uszeregowana
Drzewo- relacja złożenia na klasie Wezel (węzły niższe są częścią węzłów wyższych)
Tablica- atrybut indeks
OPERACJE:
Operacje (metody) definiują zachowanie danego obiektu.
Wywołanie metody = przesłanie komunikatu
Operacje danego obiektu, które są dostępne dla dla innych obiektów definiują zestaw usług, które może on świadczyć.
Zestaw świadczonych usług to interfejs obiektu.
Metody są wykonywane na rzecz obiektu.
Posiadają one swoje ciało (implementację)- fragment kodu wykonywanego po uruchomieniu danej metody (mogą być tam zawarte modyfikacje danego obiektu lub wywołania metod tego samego lub innego obiektu).
Operacje mogą zawierać zestaw argumentów oraz wartość. Kod wewnętrz metody może używać podanych argumentów oraz musi zwracać wartość, o ile została ona zadeklarowana.
METODY A FUNKCJE:
Metody przypominają procedury w językach strukturalnych, bo zawierają kod, mają atrybuty i mogą zwracać jakąś wartość.
Zasadnicza różnica:
Metody posiadają obok argumentów dostęp do obiektu na rzecz którego zostały wywołane.
KONSTRUKTOR I DESTRUKTOR:
Konstruktor i destruktor to szczegółowe metody opisujące, jak obiekt powinien
się utworzyć i jak zniszczyć.
Konstruktor opisuje jak zainicjować obiekt, aby był on poprawny z punktu widzenia semantyki aplikacji. Ustawia zależności i atrybuty, których wymaga klasa. Może informować inne części systemu, że właśnie powstał nowy obiekt. Z punktu widzenia modelu jest on pełnoprawną metodą. Może być więcej niż jeden konstruktor.
Zastosowanie destruktora wiąże się z:
- zwolnienieniem pamięci
- zamknięciem zasobów
- poinformowaniem innych obiektów, że obiektu już nie ma
Jeśli coś zostało utworzone w konstruktorze to musi być zniszczone w destruktorze
METODY KLAS:
Metody klas reprezentują sytuację, kiedy jakieś zachowanie jest wspólne dla wszystkich obiektów danej klasy
Metody klas nie mogą korzystać z cech obiektu, bo nie ma obiektu na rzecz którego byłyby wywoływane
Dodatkowo mogą być wywoływane, gdy nie ma powołanego do życia żadnego obiektu danej klasy
HERMETYZACJA OPERACJI:
Nie zawsze jest pożądane, aby wszystkie metody były dostępne dla innych obiektów.
Analogicznie- świat pełen jest ograniczeń w korzystaniu z usług obiektów na rzecz innych obiektów.
System obiektowy odzwierciedla to poprzez hermetyzację (enkapsulację) swoich metod.
Obiekt część swoich metod eksponuje światu zewnętrznemu, inne tylko niektórym obiektom, do jeszcze innych sam tylko ma dostęp.
Polimorfizm
Różnorodne zachowanie obiektów dla tej samej czynności nazywamy polimorfizmem (polymorphism- wielopostaciowość). Polimorfizm to możliwość umieszczania różnej implementacji pod tym samym interfejsem. Te same operacje dla różnych obiektów mogą zachowywać się różnie. Żeby nie owijac bo to bez sensu, jak zrobie metode w klasie A i w klasie B która dziedziczy po A o tej samej nazwie ale różnym działaniu to B skorzysta ze swojej własnej, zadziała to tylko kiedy sygnatura będzie ta sama
typ nazwa(parametry) musza sie zgadzać
Polimorfizm i abstrakcja
Metoda zadeklarowana w interfejsie, ale nie zaimplementowana (bo np. brak jest jakiegoś ogólnego przepisu) nazywana jest metodą abstrakcyjną. Operacje wykonywane są w klasach dziedziczących. Z abstrakcją metod ściśle wiąże się pojęcie abstrakcji klas. Tak samo, jak obiecujemy metodę, ale jej nie implementujemy, tak samo możemy obiecać klasę, ale nie pozwolić jej stosować bezpośrednio, tzn. nie pozwolić tworzyć z niej obiektów, a jedynie dziedziczyć. Taka klasa nazywa się klasą abstrakcyjną. Jesli klasa ma metode abstrakcyjną to jest klasą abstrakcyjną, jesli klasa jest abstrakcyjna nie znaczy, że ma metode absrakcyjną.
Atrybuty
z 3 slajdów wynika, że atrybut to int a w klasie. Atrybuty moga być właściwe dla obiektu konkretnego (np nazwisko dla człowieka) ale mogą być np właściwe dla całej klasy, int ile_cyfr przechowujace ilość cyfr w peselu człowieka.
Atrybuty odróżniają się tym od obiektów powiązanych zależnością, że nie myślimy o nich jak o autonomicznym bycie, a jedynie jest on dla nas cechą innego, bardziej wyróżnialnego bytu. Cokolwiek by chciał tym powiedzieć
Hermetyzacja
Ze obiekty są hermetyczne i tylko metody maja do nich dostęp to wiemy.
Komponenty
Będzie nas uczył, że fajnie jest duży i trudny problem podzielić na kilka małych i rozwiązać, no geniusz... Dzieli się problem na klasy i one go rozwiązują a potem sie łączy rozwiąznia. (dekompozycja problemu). Ja to zrobie tak, wkleje tutaj zalety komponentów ale przeczytajcie je tylko raz, naprawde nie warto więcej
//// to czytamy tylko raz ////
Komponent pozwala wyodrębnić jakiś cel, jakiś problem jako grupę klas.
Klasy wewnątrz komponentu są powiązane znacznie silniej niż poza komponentem.
Wewnątrz komponentu można wyodrębnić klasę lub klasy mające interfejsy publiczne i prywatne (widoczne tylko dla pozostałych klas wewnątrz komponentu).
Pozwala to ukryć klasy przed ingerencją z zewnątrz
Kolejna zaleta komponentów to możliwość określenia zależności pomiędzy grupami klas a następnie rozwijania tych grup niezależnie od siebie.
W ten sposób można równolegle prowadzić prace nad poszczególnymi podsystemami i skrócić czas tworzenia systemu.
Można też dowolnie zastępować komponenty i pozostaje to bez wpływu na resztę systemu
Komponenty stosuje każdy wielokrotnie w ciągu dnia.
Przykład nieinformatycznego komponentu:
Posiłek
skonstruowany z komponentów spożywczych wyprodukowanych przez kogoś innego. A jednodaniowy posiłek może być komponentem obiadu.
W informatyce komponenty zagościły dzięki technologii obiektowej
Przykłady komponentów:
graficzne elementy interejsu użytkownika (przycisk, pasek przewijania, menu)
system SAP (architektura oparta o komponenty- można zmodelować każdą organizację w ramach tego samego środowiska)
Komponenty nie tylko się tworzy ale i ponownie używa.
Dzięki nim nie trzeba tego samego problemu rozwiązywać wielokrotnie.
Dobrze zrobiony komponent może stanowić element rozwiązań dla zupełnie innych problemów.
Różnica pomiędzy ponownym użyciem poprzez dziedziczenie, a poprzez wykorzystanie komponentu:
Dziedziczenie ograniczone jest do jednej klasy (wada, bo trzeba rozwiązać problem). Komponent- nie.
Istnieją komponenty krańcowo sparametryzowane- wada, bo nie wiadomo co do czego jest potrzebne
Przykład: programy użytkowe UNIXa: cat, ls
//// odtąt czytamy już normalnie, tylko tego wyżej nie warto oglądać////
obiektowe języki programowania i kilka pierdół:
SIMULA67 // pewnie pierwszy, wg pytań by Cobra
SMALLTALK80
C++
JAVA
C#
PYTHON
RUBY
Czysty model obliczeń zorientowanych obiektowo:
wszystkie typy są klasami
brak jest rozróżnienia pomiędzy klasami predefiniowanymi w języku, a klasami definiowanymi przez użytkownika
wszystkie obliczenia są realizowane poprzez wywoływanie metod (również proste operacje)
Alternatywa 1 (C++): imperatywny model typów + model obiektowy
Alternatywa 2 (JAVA): imperatywna struktura typów dla prostych typów skalarnych + obiektowa (dla pozostałych)
Przecież to bez sensu, tego wykładu się bardzo szybko nauczymy
//// to też czytamy raz i mamy w poważaniu ///
informacje o c++
Język hybrydowy wykorzystujący paradygmat imperatywny i obiektowy
Obiekty mogą być alokowane na stosie lub na stercie
Dla obiektów na stercie jest jawna dealokacja- delete
Każda klasa ma co najmniej 1 konstruktor i może mieć destruktor (wywołane niejawne w chwili alokacji i dealokacji obiektu)
Dziedziczenie:
C++ pozwala na dziedziczenie wielokrotne
Klasa może nie mieć klasy bazowej
Klasy mogą mieć składniki prywatne, niewidoczne dla klas pochodnych
Podklasy nie są zatem podtypami
Składniki prywatne dostępne są tylko dla własnych metod oraz dla klas zaprzyjaźnionych (deklaracja z użyciem friend)
Dziedziczenie (c.d.):
klasa pochodna może zmienić tryb dostępu do odziedziczonych składników
definicja klasy pochodnej może być opatrzona kwalifikatorami: private, protected lub public (podobnie jak poszczególne składniki)
metoda przedefiniująca daną metodę musi mieć taki sam protokół (w przeciwnym razie będzie uznana za nową metodę i nie będzie mogła być wywołana przez zmienną polimorficzną z klasy bazowej)
Dynamiczne wiązanie wywołań z metodami:
obiekty zadeklarowane za pomocą zmiennych niewskaźnikowych są alokowane na stosie- wiązanie jest statyczne
zmienna wskaźnikowa mająca typ pewnej klasy bazowej może wskazywać obiekty tejże klasy oraz klas pochodnych- jest polimorficzna
zmienne niewskaźnikowe nie mogą być polimorficzne
Dynamiczne wiązanie wywołań z metodami (c.d.):
gdy używamy zmiennej polimorficznej do wywołania metody zdefiniowanej w jednej z klas pochodnych, wywołanie to musi zostać związane z właściwą definicją metody
metody, które mają być wiązane dynamicznie deklaruje się ze słowem kluczowym virtual (metoda taka może być zredefiniowana w klasach pochodnych- jej wywołanie należy traktować jako polimorficzne)
programista decyduje, czy stosować wiązanie statyczne (szybsze) czy dynamiczne
Dynamiczne wiązanie wywołań z metodami (c.d.):
metodę abstrakcyjną deklaruje się za pomocą słowa kluczowego virtual i pseudopodstawienia „=0”,
np. virtual void drukuj() = 0;
klasa zawierająca metodę abstrakcyjną jest abstrakcyjna- nie można tworzyć obiektów z tej klasy (można deklarować wskaźniki do niej dla realizacji wywołań polimorficznych)
Zalety i wady:
wysoka efektywność kodu
bardzo szczegółowe sterowanie dostępem przy dziedziczeniu
złożoność języka
//// nie wydurniajcie sie, raz dla odświeżenia pamięci i tyle, my to wiemy ///
/// a to o jawie, ja tego nie wiem więc wkleje, znam takich co wiedzą ///
Pierwotne typy skalarne (np. int, float) nie są obiektami, pozostałe- tak
Wszystkie klasy pochodzą od klasy Object
Klasy samoistne nie są dozwolone
Wszystkie obiekty są alokowane dynamicznie na stercie
Dealokacja jest niejawna
Metoda finalize() zdefiniowana we własnej klasie umożliwia realizację prac porządkowych przed dealokacją obiektu
Dziedziczenie:
dopuszczalne jest dziedziczenie pojedyncze, ale z wyjątkami
za pomocą słowa kluczowego interface deklaruje się klasy abstrakcyjne po których można dziedziczyć do woli
oprócz 1 klasy bazowej dana klasa może mieć dowolną ilość interfejsów bazowych
klasy interface mogą zawierać jedynie deklaracje metod i stałych (są całkowicie abstrakcyjne)
Dziedziczenie:
można definiować metody abstrakcyjne i klasy abstrakcyjne za pomocą słowa kluczowego abstract, ale klasę abstrakcyjną zawierającą same metody abstrakcyjne definiujemy jako interface
Dynamiczne wiązanie wywołań z metodami:
wywołania są wiązane z metodami dynamicznie, chyba że metoda jest zadeklarowana ze słowem kluczowym final, static lub private
każda z deklaracji (final, static lub private) oznacza, że metoda nie może być przedefiniowana
Zalety i wady:
Język bardziej konsekwentnie obiektowy niż C++
Prostsze sterowanie dostępem
Dwoistość typów
//// i c#
Dosyć duże podobieństwo do języka Java
Oprócz zwykłych klas (deklarowane za pomocą class) dostępne są klasy lekkie (deklarowane za pomocą struct)
Klasy lekkie nie pozwalają na dziedziczenie
Klasy lekkie mogą być alokowane na stosie
Dziedziczenie:
zawsze publiczne
Na szczycie hierarchii dziedziczenia znajduje się klasa System.Object (domyślne o niejawnym charakterze)
sterowanie ukrywaniem i przesłanianiem metod za pomocą słów kluczowych new, virtual, override (metody przesłaniające)
modyfikatory dostępu public, private, protected oraz internal (dostęp (jak public) ma tylko kod stanowiący część tego samego komponentu .NET), reszta jak private
Dziedziczenie:
klasy zamknięte uniemożliwiające wywiedzenie z nich nowych klas (słowo kluczowe sealed)
metody zamknięte uniemożliwiające przesłaniania metody przez klasę pochodną (słowo kluczowe sealed)
Dodatkowe sterowanie poprzez słowa kluczowe new oraz base (new ukrywa metodę o takiej samej nazwie z klasy bazowej, base ją odkrywa)
Dynamiczne wiązanie wywołań z metodami:
metody, które mają być wiązane dynamicznie, muszą być jawnie oznaczone jako virtual (w klasie bazowej) i override (w klasach pochodnych)
klasy abstrakcyjne definiuje się z zastosowaniem słowa kluczowego abstract