Dynami zneprogramowanie obiektowe
deni jaklasy
lass Osoba
...
end
skªadoweklasy
◮
atrybuty obiektów- zmienne, który h zakresemjestobiekt,i h
nazwy rozpo zynaj¡si od znaku
◮
atrybuty klasy -zmienne, który h zakresemjestklasa,i h
nazwy rozpo zynaj¡si od znaków
◮
metodyobiektuto funk jewywoªywane w kontek± ie obiektu,
maj¡dostp do wszystki h inny hskªadowy h obiektuiklasy
◮
metodyklasy tofunk jewywoªywane wkontek± ie klasy,maj¡
dostp do wszystki hskªadowy h klasy
lass Osoba
def initialize(imie,nazwisko)
imie = imie
nazwisko = nazwisko
end
konstruktor
◮
konstruktortometodao nazwieinitialize
◮
konstruktormo»eby¢tylko jeden (w Rubym nie mo»na
prze i¡»a¢nazw metod)
lass Osoba
def initialize(imie, nazwisko)
imie = imie
nazwisko = nazwisko
end
atrybutyobiektów
◮
atrybutów, podobniejak inny h zmienny h,nie deklaruje si
◮
atrybut tworzy si przypisuj¡ do niegowarto±¢
◮
zestawatrybutów obiektunie jestustalony
lass Osoba
def initialize(imie, nazwisko)
imie = imie
nazwisko = nazwisko
end
def nadaj_pesel(imie)
pesel=pesel
end
end
osoba = Osoba.new("Jan","Kowals ki" ) # obiek osoba ma 2 atrybuty
dynamikaobiektu
◮
aktualn¡list atrybutówmo»na sprawdzi¢ zapomo ¡metody
instan e_variables (metodaklasy Obje t- patrzte» inne
metodytej klasy)
o = Osoba.new("Jan","Kowalski")
=> #<Osoba:0x81 31f0 imie="Jan", nazwisko="Kowalski">
o.instan e_variables
=> [:imie, :nazwisko℄
o.nadaj_pesel("12345678")
=> "12345678"
o.instan e_variables
=> [:imie, :nazwisko, :pesel℄
dynamikaobiektu
Mo»liwe jestte»dodawanie pojedyn zemu obiektowimetod.
b=Obje t.new
=> #<Obje t:0x8239760>
def b.moja()print"Tylko jato umiem!"end
=> nil
b.moja
Tylko ja to umiem!
b.singleton_methods # lista metod wªasny h obiektu
=> [:moja℄
Programowanieobiektoweopartenaprototypa h
Programowanie obiektowe opartenaprototypa h (prototype-based
OOP) toalternatywnewobe opartego naklasa h podej± ie do
programowania obiektowego. Podstawowe opera jeto:
◮
klonowaneobiektów
◮
rozszerzanie obiektów
Dziekipokazanym w ze±niej me hanizmom, Ruby umo»liwia
stosowanie tego styluprogramowania.
Programowanieobiektoweopartenaprototypa h: przykªad
b=Obje t.new
=> #<Obje t:0x8239760>
defb.moja()print"Jatoumiem!"end
=> nil
b.moja
Tylko ja to umiem!
=b. lone
=> #<Obje t:0x822894 >
.moja
Tylko ja to umiem!
=> nil
def .tylkomoja()print"Ajaumiemjesz zeto!"end
=> nil
.tylkomoja
A ja umiem jesz ze to!
=> nil
b.tylkomoja
NoMethodError: undefined method `tylkomoja' for #<Obje t:0x8239760>
from (irb):65503
dynamikaklasy
W trak ie dziaªania programu mo»na zmodykowa¢ deni j klasy,
nawet je±liistniej¡ju»obiekty tej klasy.
lass K; end
=> nil
k = K.new
=> #<K:0x824d6a >
k.instan e_variables
=> [℄
K.method_defined?(:nazwij )
=> false
lass K; def nazwij(imie) imie = imie end end
=> nil
K.method_defined?(:nazwij )
=> true
k.nazwij("Jan")
=> "Jan"
k.instan e_variables
dynamikaklasy
Modykowa¢ mo»na wszystkieklasy!
lass Array; def sum() inje t(0)|a,x| a+x end end
=> nil
[1,2,3,4℄.sum
=> 10
lass Fixnum; def +(x) self*x end end
=> nil
2+4
=> 8
dynamikaklasyiobiektu: realiza ja
◮
klasajestobiektem(typClass)
◮
klasa(obiektklasy - typu Class)prze howuje list metod
(listata mo»esi zmienia¢),list atrybutówklasy (listata
mo»e sizmienia¢)oraz referen jdonadklasy(innego obiektu
typuClass)
◮
obiekt (instan ji klasy)prze howuje referen jdo obiektu
swojej klasy(obiektten mo»e ulega¢ modyka ji)oraz list
zmienny hobiektu(lista tamo»e sizmienia¢)
dziedzi zenie
◮
dziedzi zeniejednokrotne
◮
skªadnia:
lass A << B
...
end
◮
wywoªanie konstruktora nadklasy:
super(parametry )
klasyanonimowe
Mo»liwe jestdeniowanie nienazwanejklasy tylko dlapojedyn zego
obiektu.
a = nil
lass << a
def hello
print "Cze±¢, jestem jedyny z tej klasy"
end
end
a.hello
domieszkowanie(mixins)
◮
me hanizmpodobny do interfejsówJavy
◮
ale bardziej elasty znyi owiekszej mo y(domieszka mo»e
zawiera¢ wszystkieelementy,któremog¡wyst¡pi¢w deni ji
klasy)
◮
domieszkimo»na rozumie¢jako z± iowe deni je klasy
◮
domieszkideniuje si jako moduªy (module)
◮
moduªy mo»nawª¡ za¢do klas (wdowolnejilo± i), jak
równie» do pojedyn zy h obiektów
doª¡ zeniemoduªudoklasy
module Numerowany
def setid(id)
id=id
end
def id
id
end
end
lass Osoba
in ludeNumerowany
def initialize(imie, nazwisko)
imie = imie
nazwisko = nazwisko
end
end
$osoba = Osoba.new("Jan","Kowalski ")
$osoba.setid(12345678)
doª¡ zeniemoduªudopojedyn zegoobiektu
module Numerowany
def setid(id)
id=id
end
def id
id
end
end
lass Osoba
def initialize(imie, nazwisko)
imie = imie
nazwisko = nazwisko
end
end
osoba = Osoba.new("Jan","Kowals ki" )
osoba.extend Numerowany
osoba.setid(12345678)
Ewaluowaniedowolnegokoduwkontek± ieobiektu
Poza opera jamizdeniowanymi w posta imetod,mo»liwe jest
ewaluowanie dowolnegokoduw kontek± ie obiektu.
lass Osoba
def initialize(imie, nazwisko)
imie = imie
nazwisko = nazwisko
end
end
a = Osoba.new("Jan","Kowals ki")
a.instan e_eval{ print imie + ' ' + nazwisko }
a.instan e_eval{ ekstra_atrybut = "Hej!" }
a.instan e_eval{ print ekstra_atrybut}