Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałJulianna Bartman Został zmieniony 11 lat temu
1
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące1 Komunikaty do self Odbiorcą jest obiekt, w którym wykonuje się ten komunikat Szukanie metody rozpoczyna się od klasy obiektu, w którym wykonuje się ten komunikat (a nie od klasy, w której występuje tekstowo ten komunikat). Jest to wiązanie dynamiczne, a nie statyczne. Object subclass: #One........ Metody egzemplarzowe test ^1 result1 ^ self test One sublcass: #Two Metody egzemplarzowe test ^2 x1 := One new. x2 := Two new. x1 test1 x1 result11 x2 test2 x2 result12
2
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące2 Komunikaty do super Odbiorcą jest obiekt wyznaczony przez self. szukanie metody rozpoczyna się od nadklasy, w której występuje tekstowo ten komunikat. Jest to wiązanie statyczne, a nie dynamiczne. Two subclass: #Three.... metody egzemplarzowe result2 ^self result1 result3 ^super test Three subclass: #Four metody egzemplarzowe test ^4 x3 := Three new. x4 := Four new. x3 test2 x4 result14 x3 result22 x4 result24 x3 result32 x4 result32
3
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące3 Identyfikatory ciągi liter, cyfr (i znaków podkreślenia), zaczynające się od litery (lub podkreślenia), konwencja: nie używa się podkreśleń, rozróżniane są wielkie i małe litery, niektóre implementacje akceptują polskie znaki (np. OS), nie ma ograniczenia na długość, konwencja : –z małej litery zaczynają się identyfikatory: zmiennych lokalnych, zmiennych egzemplarzowych, metod egzemplarzowych, –z wielkiej litery zaczynają się identyfikatory: klas, zmiennych klasowych, metod klasowych, zmiennych globalnych,
4
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące4 Literały liczby (Number: Integer, Float, Fraction, Decimal, …) 3-123 15r11 Integer (SmallInteger) 123456789 Integer (LongInteger) 1.3d 12345678901 (Decimal (BCD) OS) -10.4 128.4e-3 Float 4/7 Fraction znaki (Character) $a $$ $# $. napisy (String) Ala ma kotaAdams symbole (Symbol) #Licznik #symbol #+ #value: tablice #(5 3 $a def)
5
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące5 Podstawowe klasy Object Boolean False True Collection IndexedCollection Array String Symbol Set Magnitude Character Date Number Float Fraction Integer Time UndefinedObject true - jedyny obiekt klasy True false - jedyny obiekt klasy False odpowiadają na komunikaty: & and:or:| ifFalse: ifTrue:ifTrue:ifFalse:ifFalse:ifTrue nil - jedyny obiekt klasy UndefinedObject
6
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące6 Magnitude Na obiektach tej klasy jest określony porządek liniowy >= Uwaga: =, ==, ~=, ~ (czyli równości i różności) są odziedziczone z klasy Object. W podklasie Range nie ma =. Number Na obiektach tej klasy są określone operacje arytmetyczne. +-*/ // aNumberiloraz całkowity odbiorcy przez aNumber \\ aNumberreszta całkowita abswartość bezwzględna odbiorcy negatednegacja odbiorcy (-k nie jest poprawne w wielu Smalltalkach: OS OK, Dolphin nie) sinsinus odbiorcy coscosinus odbiorcy Float Liczby rzeczywiste reprezentowane zmiennopozycyjnie. Fraction Ułamki nieupraszczalne Integer Klasa liczb całkowitych. Ma podklasy: SmallInteger – małe liczby całkowite (w OS 16-bitowe) LongInteger – duże liczby całkowite (w OS 32-bitowe) factorialdaje silnię odbiorcy (Integer) gcd: anIntegerdaje największy wspólny dzielnik (Number ale musi mieć całkowitą wartość) lcm: anIntegerdaje najmniejszą wspólną wielokrotność (Integer)
7
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące7 Bloki Bloki są obiektami klasy BlockContext. Bloki to anonimowe funkcje (czyli kawałki kodu). [ :par1 :par2... | S1. S2..... Sk ] Bloki nie są wykonywane od razu po napotkaniu w tekście metody. Tworzony jest wtedy obiekt klasy BlockContext. Można wykonać treść bloku wysyłając do utworzonego tak obiektu komunikat value (value:, value:value:, …). Komunikat value daje jako wynik wartość ostatniego wyrażenia wykonanego w bloku. aBlock value: wyr1 value: wyr2 [ i := i + 1] value [:x :y | (x + y * 3 ] value: 2 value: 5 blk := [ : par | total := total + par ] total := 0. blk value: 10. blk value: 1. blk value: 3.total = 14 Blok można przekazać jako parametr komunikatu. x wykonaj: [ 3 + 5 ]wykonaj: aBlock aBlock value
8
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące8 Powrót z bloku – ^ Wystąpienie ^Expr w bloku jest powrotem z metody, w której blok występuje (tekstowo !), a więc kończy wykonanie tej metody (a nie metody, która wywołała ten blok). Przykłady: isPrime | candidate divisor | candidate := self. candidate <= 0 ifTrue: [^false]. candidate >= 1 & (candidate <= 3) ifTrue: [^true]. (candidate \\ 2) = 0 ifTrue: [^false]. divisor := 3. [ divisor * divisor <= candidate ] whileTrue: [ (candidate \\ divisor) = 0 ifTrue: [^false] ifFalse: [divisor := divisor + 2] ] ^true Użycie bloków do obsługi sytuacji wyjątkowych: set := Set new. set add: 3; add: 5; add: 7; add: 11..... set remove: 3 ifAbsent: [ nie ma obiektu! out. ^self]. set remove: 10 ifAbsent: [ nie ma obiektu! out. ^self].
9
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące9 Instrukcje warunkowe wyrWarunkowe ifTrue: [ blok1 ] wyrWarunkowe ifFalse: [blok1] wyrWarunkowe ifFalse: [blok1] ifTrue: [blok2] wyrWarunkowe ifTrue: [blok1] ifFalse: [blok2] Wyrażenie warunkowe musi być obiektem klasy True lub False. x < 3 ifTrue: [ x := 0]. liczba1 < liczba2 ifTrue: [ max := liczba2. min := liczba1] ifFalse: [max := liczba1. min := liczba2] Treść metod warunkowych W klasie True: ifFalse: aBlock ^nil ifTrue: aBlock ^ aBlock value ifTrue: trueBlock ifFalse: falseBlock ^ trueBlock value ifFalse: falseBlock ifTrue: trueBlock ^ trueBlock value
10
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące10 Pętle [ blok warunkowy ] whileTrue: [ blok pętli ] [ blok warunkowy ] whileFalse: [ blok pętli ] Blok warunkowy powinien być blokiem bezparametrowym takim, że wysłany do niego komunikat value zwraca true lub false. Komunikaty whileTrue: i whileFalse: są rozumiane przez bloki. suma := 0. liczba := 4. [ liczba <= 100 ] whileTrue: [ suma := suma + liczba. liczba := liczba + 1] napis := abcdef345. i := 1. [ (napis at: i) out. (napis at: i ) ~~$3 ] whileTrue: [ i := i + 1] Możliwa treść metody whileTrue: w klasie BlockContext whileTrue: aBlock self value ifTrue: [ aBlock value. self whileTrue: aBlock ] ^ nil
11
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące11 liczba timesRepeat: [ blok ] suma := 0. i := 0. 5 timesRepeat: [ i := i + 1. suma := suma + i ] timesRepeat: aBlock | anInteger | anInteger := self. [ anInteger > 0 ] whileTrue: [ anInteger := anInteger - 1. aBlock value ] Pętle liczbowe Odpowiednie metody są zdefiniowane w klasie Number lub Integer. liczba to: final by: step do: aBlock liczba to: final do: aBlock 1 to: 10 by: 2 do: [ :i | tab at: i put: 0 ] zeruje co drugi element tablicy tab Możliwa realizacja: to: final by: step do: aBlock | index | index := self. step > 0 ifTrue: [ [ index <= final ] whileTrue: [ aBlock value: index. index := index + step] ] ifFalse:......
12
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące12 Klasa Object Najważniejsze metody: =porównanie obiektów. Zwykle przedefiniowane w podklasach (czy obiekty są takie same) = =porównanie obiektów (czy to jest ten sam obiekt) ~ =, ~~różność obiektów classzwraca klasę obiektu isKindOf: aClassczy to jest obiekt tej klasy lub jej podklasy isMemberOf: aClassczy to jest obiekt tej klasy copykopia obiektu (tzw. powierzchowna) shallowCopyj. w. deepCopykopia głęboka, z powierzchowną kopią atrybutów implementedBySubclasssygnalizacja (dla klasy abstrakcyjnej), że ta metoda nie może tu być zaimplementowana inspectwłącza okno oglądania obiektu isNil, notNilczy obiekt jest równy nil (nie jest) perform: aSymbolwysyła komunikat bezparametrowy aSymbol do odbiorcy komunikatu perform:. Wynikiem jest wynik wysłanego komunikatu perform: aSymbol with: anObjectj.w., anObject jest parametrem komunikatu aSymbol perform: aSymbol withArguments: anArray j.w., anArray jest tablicą parametrów komunikatu aSymbol
13
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące13 metody klasy Object - c.d. error: aString wypisuje odpowiedni komunikat o błędzie i zatrzymuje program haltzatrzymuje program printOn: aStream wypisuje na strumień aStream tekstową reprezentację obiektu. Standardowo pisze tylko informację o klasie obiektu, powinna być przedefiniowana w poszczególnych klasach (np. Number, String, Date ) printStringdaje napis będący tekstową reprezentacją obiektu; powinna być przedefiniowana w podklasach yourselfdaje obiekt odbiorcy doesNotUnderstand: aMessage args: args generuje komunikat o błędzie - niezrozumiały komunikat aMessage
14
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące14 Klasy i metaklasy Object Behavior Class Metaclass Klasa Class reprezentuje wszystkie klasy. Metaklasy są to klasy klas. Tworzą dokładnie taką samą hierarchię, jak klasy. Każdej klasie (np. Number, Object) odpowiada metaklasa o tej samej nazwie (odp. Number, Object). Klasa jest jedynym obiektem swojej metaklasy. Każda metaklasa jest obiektem klasy Metaclass. Klasa Metaclass jest swoim własnym obiektem. Zmienne indywidualne i metody indywidualne metaklasy (zaimplementowane w klasie Class jako egzemplarzowe) są zmiennymi klasowymi i metodami klasowymi każdego obiektu (czyli jakby klasy Object). Klasy Behavior i Class definiują protokoły wspólne dla wszystkich klas. W klasie Behavior: newtworzy nowy obiekt new: sizetworzy nowy obiekt ze zmiennymi indeksowanymi namedaje nazwę odbiorcy (czyli nazwę klasy) w klasie Class: subclass: aSymbol instanceVariableNames: string1 classVariableNames: string2 poolDictionaries: pool tworzenie nowej klasy, czyli nowego obiektu odp. metaklasy
15
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące15 Refleksja Możliwość odwoływania się podczas wykonywania programu do samego programu. Można na przykład dowiedzieć się o: anObjcet class klasę obiektu anObject class name nazwę klasy obiektu anObject class canUnderstad: #metoda czy obiekt rozumie komunikat anObject class allSelectors jakie komunikaty rozumie obiekt aClass subclasses jakie podklasy ma wskazana klasa aClass allInstances jakie są wszystkie obiekty (dokładnie) tej klasy
16
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące16 Dynamiczne generowanie klas "Tworzymy dynamicznie nową klasę" Object subclass: #Test instanceVariableNames: 'a b c' classVariableNames: '' poolDictionaries: ''. "Dodajemy do niej metody" Test compileMethodSource: 'pokaz ''Udało się!'' out'. "I upewniamy się, że się udało" |a| a := Test new. "tworzy obiekt klasy Test" a pokaz. "wypisuje tekst do Transcriptu" a class canUnderstand: #pokaz. "true"
17
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące17 Obiekty ze zmiennymi indeksowanymi (nie w OS) 1. Zwykła klasa - obiekty mają tylko zwykłe (nazwane) zmienne indywidualne. Number subclass: Fraction instanceVariableNames: numerator denominator classVariableNames: poolDictionaries: category: Numeric 2. Klasa, której obiekty, oprócz nazwanych zmiennych indywidualnych, mają zmienne indeksowane. Ich liczba jest określona w momencie tworzenia obiektu (new: size). FixedSizeCollection variableSubclass: Array instanceVariableNames: classVariableNames: poolDictionaries: category: Array Objet variableSubclass: Stack instanceVariableNames: top classVariableNames:...... 3. Klasa, której obiekty mają wyłącznie indeksowane zmienne indywidualne (bajty). Rozmiar obiektów jest określany przy ich tworzeniu (new: size) FixedSizeCollection variableByteSubclass: String classVariableNames: poolDictionaries: CharacterConstants category: String
18
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące18 Metody (z klasy Object i Behavior), które są odbierane przez klasy i obiekty ze zmiennymi indeksowanymi: new: aNumbertworzy nowy obiekt, który ma aNumber zmiennych indeksowanych. błąd, jeśli klasa nie ma zmiennych indeksowanych. tab := Array new: 10 at: anIntegerzwraca obiekt, który znajduje się na pozycji anInteger w odbiorcy. Błąd, jeśli obiekt nie ma zmiennych indeksowanych lub anInteger przekracza ich liczbę. y := tab at: 3 at: anInteger put: anObjectwstawia obiekt anObject na pozycję anInteger odbiorcy. Błąd j.w. tab at: 2 put: test. tab at: 3 put: 0 basicAt: anIntegerjak at:, nie jest przedefiniowane w podklasach basicAt: anInt put: anObjak at: put:, nie jest przedefiniowane w podklasach sizezwraca liczbę indeksowanych zmiennych tab size = 10 true basicSizejak size, nie jest przedefiniowane w podklasach
19
OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące19 Przykład - MonitoredArray Chcemy zdefiniować nową klasę pozwalającą na badanie częstości dostępu do elementów tablicy. Klasa MonitoredArray będzie podklasą klasy Array. Musimy przedefiniować metodę at: tak, aby zliczała dostęp do elementów tablicy. Klasa MonitoredArray może zastąpić klasę Array w każdej aplikacji. Array subclass: #MonitoredArray instanceVariableNames: liczniki classVariableNames: poolDictionaries: Metody klasowe new: anInteger ^(super new: anInteger) initialize Metody indywidualne initialize Tworzy równoległą tablicę liczniki | size | size := self size. liczniki := Array new: size. 1 to: size do: [ :i | liczniki at: i put: 0 ] at: i liczniki at: i put: ((liczniki at: i) + 1). ^super at: i licznikiDostepu ^liczniki
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.