Wykład 6: Dziedziczenie.

Podobne dokumenty
.NET Klasy, obiekty. ciąg dalszy

Wykład 8: Metaklasy. Interfejsy.

Tworzenie własnych komponentów

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

Podstawy Programowania semestr drugi. Wykład czternasty

Wykład 5 Okna MDI i SDI, dziedziczenie

Kurs WWW. Paweł Rajba.

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

Programowanie obiektowe

TEMAT : KLASY DZIEDZICZENIE

Programowanie obiektowe

Programowanie obiektowe

Dokumentacja do API Javy.

Programowanie obiektowe

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe i zdarzeniowe

Typy sparametryzowane

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

PODSTAWY PROGRAMOWANIA

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

Programowanie obiektowe

PHP 5 język obiektowy

1. Język JAVA. 1. Pierwszy program. 2. Kalkulator. 3. Klasy. 4. Dziedziczenie

Lista, Stos, Kolejka, Tablica Asocjacyjna

Programowanie obiektowe w VB cz 2

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Multimedia JAVA. Historia

Dziedziczenie. Ogólna postać dziedziczenia klas:

Dziedziczenie. dr Jarosław Skaruz

Podstawy programowania III

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

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Programowanie obiektowe

Programowanie obiektowe

Aplikacje w środowisku Java

Materiały do zajęć VII

Dziedziczenie. Tomasz Borzyszkowski

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Programowanie, część I

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

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

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

Wykład 7: Lazarus GUI

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Java Język programowania

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

10. Programowanie obiektowe w PHP5

Programowanie w Internecie. Java

Polimorfizm. dr Jarosław Skaruz

PARADYGMATY PROGRAMOWANIA Wykład 4

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Technologie i usługi internetowe cz. 2

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie 2. Język C++. Wykład 9.

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Wykład 6: Dziedziczenie

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Dziedziczenie jednobazowe, poliformizm

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

KOTLIN. Język programowania dla Androida

Programowanie obiektowe. Obiekt Klasa Składnia klasy: Interfejsy Składnia interfejsu: Metody Składnia instrukcji Sub: Składnia instrukcji function:

Narzędzia 2. dr inż. Tadeusz Jeleniewski

Definiowanie własnych klas

Programowanie, część I

Mechanizm dziedziczenia

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Język C++ Programowanie obiektowe

Programowanie Komputerów

1. Programowanie obiektowe. Wstęp.

Szablony klas, zastosowanie szablonów w programach

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Podstawy programowania. Programowanie obiektowe

Wykład 8: klasy cz. 4

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

Obiekty: co i jak. Wykonał: Piotr Pięda dla koła naukowego KNI

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Język JAVA podstawy. wykład 1, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Zaawansowane programowanie w C++ (PCP)

Wykład 1: Przegląd języka

Dokumentacja systemu pocztowego zaimplementowanego w programie SYSTEmEG

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

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Abstrakcyjny typ danych

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

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

Do czego służą klasy?

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Zaawansowana Grafika Komputerowa

Języki programowania imperatywnego

Język programowania PASCAL

Transkrypt:

Kurs języka Object/Delphi Pascal na bazie implementacji Free Pascal. autor Łukasz Stafiniak Email: lukstafi@gmail.com, lukstafi@ii.uni.wroc.pl Web: www.ii.uni.wroc.pl/~lukstafi Jeśli zauważysz błędy na slajdach, proszę daj znać! Wykład 6: Dziedziczenie. Ray Tracing. Własności: property. Interfejsy. 1

Wprowadzenie do Ray Tracingu Ray-tracing to metoda generowania grafiki poprzez śledzenie promieni światła wstecz, od kamery do obiektów na scenie, i dalej, modelując rozproszenie lub odbicie, do źródeł światła lub innych obiektów. Promień to półprosta zaczepiona w ustalonym punkcie i biegnąca w ustalonym kierunku. Punkt i kierunek to wektory (trójki liczb). Dodatkowo będziemy pamiętać żeby kierunek był unormowany (tzn. długości 1). Potrzebujemy metody znajdującej przecięcie promienia i obiektu, tzn. punkt padania promienia na obiekt. W typie THit dodatkowo pamiętamy parametry powierzchni w punkcie padania promienia: Distance to odległość od początku promienia do punktu padania, Infinity oznacza brak przecięcia, Normal to unormowany wektor prostopadły do powierzchni w punkcie padania, wskazujący na zewnątrz, ObjMat to materiał powierzchni w punkcie padania. 2

DQ po +tdq + (zaczepionego CQ CQ +tdq CQ CQ = =OQ, +t d DQ i Scenę będziemy pamiętać jako scene graph, hierarchiczną strukturę przyspieszającą znajdowanie obiektów na trasie promienia. W liściach drzewa-grafu sceny będą materialne obiekty, a w węzłach wewnętrznych będziemy pamiętać bounding volume (w przykładzie BoundingBall), czyli obiekt w którego środku są wszystkie obiekty poniżej. w biegnącego w kierunku ) ( ) OQ R 2 =0 znajdziemy roz- PQ Przecięcie promienia OQ t dodatnich) ze sferą ( PQ wiązując ) ( OQ ( OQ t DQ ) R 2 = 0 ze względu na t. Dostaniemy równanie kwadratowe: wybieramy mniejsze z rozwiązań dodatnich (bliższy z maks. dwóch punktów przecięcia) jeśli nie ma rozwiązań lub rozwiązania są ujemne, sfera nie jest na trasie promienia. Unormowany kierunek, tzn. DQ DQ 1, upraszcza obliczenia. Wektor normalny to PQ PQ CQ CQ gdzie PQ t d =Distance. 3

+ od Przecięcie promienia z pudełkiem (prostopadłościanem) o krawędziach równoległych do osi układu współrzędnych, znajdziemy biorąc część wspólną odcinków promienia przechodzących przez trzy płyty ograniczające pudełko rozpięte między (x 0, y 0,z 0 ) a (x 1, y 1,z 1 ): { Px [x 0,x 1 ] } PQ itd. i zwracając bliższy z dodatnich końców (jeśli istnieje). Rozwiązujemy: x 0 = O x +t x0 D x x 1 = O x +t x1 D x i tak samo dla y, z. Dostaniemy odcinek: wzdłuż t = OQ max{min(t x0,t x1 ), min(t y0,t y1 ), min(t z0,t z1 )} do t=min{max(t x0, t x1 ), max (t y0, t y1 ), max (t z0, t z1 )}, o ile pierwsza liczba jest mniejsza od drugiej. t DQ 4

Po znalezieniu punktu padania, liczymy natężenie światła z tego punktu jako kombinację dwóch efektów: Dla powierzchni matowych, prawo Lamberta mówi że jasność obiektu jest proporcjonalna do kąta padania światła na powierzchnię (dokładniej, do cosinusa odchylenia kierunku światła od normalnej), bez względu na kąt patrzenia na powierzchnię. Uwzględniamy ten składnik tylko jeśli źródło światła nie jest przesłonięte. Dla efektu światła nieskończenie daleko (jak słoneczne), możemy uprościć biorąc zawsze ten sam kierunek światła. Dla powierzchni lustrzanych, znajdujemy promień odbicia zgodnie z regułą kąt padania jest równy kątowi odbicia, i rekurencyjnie bierzemy jasność punktu padania odbitego promienia. Obrazek budujemy z jasności punktów padania promieni puszczonych poprzez każdy piksel ekranu pomiędzy kamerą (okiem) a sceną. 5

źródło światła kamera (oko) normalne do powierzch. dalsze odbicie promień padający promień odbity odchylenie światła padającego 6

Dziedziczenie type Klasy deklarujemy zwykle w interfejsie inaczej niewidoczne na zewnątrz. TBaseClass = class strict private Część dostępna tylko w innych metodach tej klasy. HandleWithCare : Integer; Pola muszą poprzedzać metody... procedure Boom (When : Integer); private Część dostępna w całym module (pliku). DataField : String;...ale tylko w danym bloku dostępności. function Auxiliary : String; protected Część dostępna też w klasach dziedziczących procedure SetData (Index : Integer; Data : String); public Część ogólnie dostępna. destructor Destroy; override; Zastępujemy destruktor z TObject. function Add (Data : String) : Integer; virtual; Metodę virtual będzie można zastąpić. TDerivClass = class (TBaseClass) Domyślny dostęp public. function Add (Data : String) : Integer; override; Musimy jawnie zastępować (override) metody. 7

type TBaseClass = class TDerivClass = class (TBaseClass); Domyślnie dziedziczy z TObject. Skrót na nic nie dodającą TAbstractClass = class procedure Invariant (arg : TDerivClass); virtual; abstract; procedure NotReally; virtual; TConcreteClass = class (TAbstractClass) procedure Invariant (arg : TDerivClass); override; procedure NotReally; reintroduce; klasę pochodną. Klasa abstrakcyjna, bo ma: metodę bez implementacji. Przy zastępowaniu metody, typy argumentów muszą się pokrywać. Ta metoda nie zastępuje tej z klasy bazowej, anuluje wirtualność. Klasa może być zamknięta: class sealed co oznacza że nie można z niej dziedziczyć. 8

unit ClassExample; interface type TTestClass = class strict private procedure HelloPrivate; private Data : String; procedure HelloLocal; protected procedure HelloProtected; public constructor Create (AData : String); procedure Hello; 9

implementation procedure TTestClass.HelloPrivate; begin WriteLn ( TTestClass.HelloPrivate:, Data); procedure TTestClass.HelloLocal; begin WriteLn ( TTestClass.HelloLocal:, Data); procedure TTestClass.HelloProtected; begin WriteLn ( TTestClass.HelloProtected:, Data); procedure TTestClass.Hello; begin Write ( TTestClass.Hello: calling ); HelloPrivate; WriteLn ( continuing TTestClass.Hello:, Data); 10

constructor TTestClass.Create (AData : String); begin Data := AData; var L : TTestClass; begin L := TTestClass.Create ( Initializer ); //L.HelloPrivate; L.HelloLocal; L.Destroy; end. 11

program ClassExampleTest; uses SysUtils, ClassExample; type TDerivTest = class (TTestClass) procedure HelloExpose; procedure TDerivTest.HelloExpose; begin Write ( Exposed: ); HelloProtected; var V : TDerivTest; begin V := TDerivTest.Create ( First Data ); //V.HelloLocal; V.Hello; V.HelloExpose; V.Destroy; end. 12

O przeciążaniu raz jeszcze We Free Pascalu procedury i funkcje z jednego modułu są domyślnie przeciążane. Ale żeby przeciążyć procedury należące do różnych modułów, muszą one być w obydwu modułach zadeklarowane z modyfikatorem wywołania overload. Również gdy są to metody odpowiednio klasy bazowej i pochodnej! W Delphi zawsze trzeba używać overload przy przeciążaniu. virtual / abstract / override poprzedza overload (razem precyzyjnie wyrażają rolę metody) 13

Metody klasy Zwykłe metody zawsze wywoływane są na instancji klasy (tzn. na obiekcie) i mają dostęp do instancji poprzez referencję self (odpowiednik this z C++ i Javy). Metody klasy zadeklarowane przez class procedure / class function nie mają dostępu do self ani do pól i metod instancji, ale za to nie potrzebują instancji by ich używać: można też wywołać przez nazwę klasy. Odpowiednik metod static z Javy. Przydatne m.in. w połączeniu z typami generycznymi. TCharacter = class sealed class function GetNumericValue(AChar : UnicodeChar) : Double; static; overload; class function GetNumericValue(const AString : UnicodeString; AIndex : Integer) : Double; overload; 14

Wywoływanie metody z klasy bazowej Gdy zastępujemy metodę z klasy bazowej, często potrzebujemy w nowej metodzie wywołać starą. Szczególnie w konstruktorze i destruktorze! Słowo kluczowe inherited; bez parametrów wywoła metodę którą zastępujemy, przekazując jej argumenty aktualnej metody. Działa dla wszystkich metod, nie tylko konstruktorów. Zwróć uwagę, że zastąpić można tylko metodę o tej samej sygnaturze. Żeby wywołać dowolną inną metodę Method z klasy bazowej: inherited Method (arg); 15

Własności instancji: property Własności to specyficzne metody odczytu/zapisu: używamy nazwy tak jak pola instancji, ale w rzeczywistości odczyt będzie wywołaniem funkcji zadeklarowanej jako specyfikator odczytu (read) dla własności, a zapis wywołaniem procedury specyfikatora zapisu (write). Zamiast funkcji / procedury możemy podać faktycznie pola instancji w specyfikatorach, nie muszą się pokrywać. Możemy pominąć jeden ze specyfikatorów dostając własność readonly lub write-only. Własności indeksowane współdzielą funkcję/procedurę odczytu/zapisu. Np. wygodne dla współrzędnych X, Y, Z indeksujących wektor. Własności tablicowe pozwalają wykorzystać składnię indeksowania tablicy Obj.Item[I] (dla własności Item). Indeksy są dowolnego typu! Własność domyślna default to własność tablicowa do której odwoła się Obj[I]. 16

Wirtualne metody publiczne TObject destructor Destroy; class function newinstance : tobject; procedure FreeInstance; procedure AfterConstruction; procedure BeforeDestruction; function Equals(Obj: TObject) : boolean; function GetHashCode: PtrInt; function ToString: ansistring; 17

Iteratory dla składni for..in Żeby móc używać for...in na instancjach klasy, powinna ona implementować interfejs: IEnumerable = interface(iinterface) function GetEnumerator: IEnumerator; GetEnumerator zwraca instancję klasy implementującej: IEnumerator = interface(iinterface) function GetCurrent: TObject; function MoveNext: Boolean; procedure Reset; property Current: TObject read GetCurrent; IInterface, także zwany IUnknown, to korzeń hierarchii interfejsów dla klas ze zliczaniem dowiązań z standardową implementacją w TInterfacedObject. 18