Komunikaty do self
This presentation is the property of its rightful owner.
Sponsored Links
1 / 19

Komunikaty do self PowerPoint PPT Presentation


  • 68 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

Komunikaty do self

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Komunikaty do self

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


Komunikaty do super

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


Identyfikatory

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,


Litera y

Literały

  • liczby (Number: Integer, Float, Fraction, Decimal, …)

    • -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 kota’‘Adam’’s’

  • symbole (Symbol)

    #Licznik #symbol #+ #value:

  • tablice

    #(5 3 $a ‘def’)


Podstawowe klasy

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


Komunikaty do self

  • 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 <= i >=.

    • 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)


  • Bloki

    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


    Powr t z bloku

    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].


    Instrukcje warunkowe

    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


    P tle

    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


    Komunikaty do self

    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: ......

    • 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 ]


    Komunikaty do self

    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


  • Komunikaty do self

    • 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


  • Klasy i metaklasy

    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


  • Refleksja

    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


    Dynamiczne generowanie klas

    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"


    Obiekty ze zmiennymi indeksowanymi nie w os

    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’


    Komunikaty do self

    • 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


  • Przyk ad monitoredarray

    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


  • Login