Skrot

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:

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:

Implementacja przekazywania danych:

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ą

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

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


Wyszukiwarka

Podobne podstrony:
asm skrot prezentacji
lipidy skrot
Leki przeciwbakteryjne skrot
PEDAGOGIKA SPOŁECZNA Pilch Lepalczyk skrót 3 pierwszych rozdziałów
czesciowe PROTEZY SZKIELETOWE skrot spiechowicz, Warszawski Uniwersytet Medyczny, protetyka
dieta-skrót, metodyka odnowy biologicznej
Rozwojówka-skrót od Małgosi, Psychologia, II rok, Psychologia rozwoju człowieka - Stanisławiak
ODP NOO cw KASIA - SKRÓT, STUDIA, WZR I st 2008-2011 zarządzanie jakością, NOO - nauka o organizacji
Historia mediów skrót informacji
RODNIKI SKRÓT
M Orwid, K Pietruszewski Psychiatria dzieci i młodzieży Skrót
Metodologia nauk społecznych notatki skrót 01
40297 skrot
2008 T4 skrot
2009 T11 skrot
Filozofia religii - skrót wykładów, religioznawstwo, III rok, I semestr, filozofia religii

więcej podobnych podstron