Programowanie w Ruby Wykład 4 Marcin Młotkowski 24 października 2012
Plan wykładu Klasy i obiekty 1 Klasy i obiekty 2 3 Marcin Młotkowski Programowanie w Ruby 2 / 40
Deklaracja klasy Klasy i obiekty class Device Marcin Młotkowski Programowanie w Ruby 3 / 40
Konstruktor Klasy i obiekty class Device def initialize(name, type) @name = name @type = type Marcin Młotkowski Programowanie w Ruby 4 / 40
Deklaracja metody Klasy i obiekty class Device def initialize(name, type)... def to s @name + + @type Marcin Młotkowski Programowanie w Ruby 5 / 40
Utworzenie obiektu Klasy i obiekty prive = Device.new( /dev/sdc, kingston ) puts prive.to s Marcin Młotkowski Programowanie w Ruby 6 / 40
Dygresja Klasy i obiekty Konwencja # równoważne: puts prive.to s puts prive Marcin Młotkowski Programowanie w Ruby 7 / 40
Zmienne obiektu (zmienne instancyjne) Składnia @nazwa Zmienne instancyjne są prywatne. Marcin Młotkowski Programowanie w Ruby 8 / 40
Dostęp do zmiennych obiektu (akcesory) class Device def name @name def zmien nazwe(nowa) @name = nowa Marcin Młotkowski Programowanie w Ruby 9 / 40
Inny modyfikator Klasy i obiekty class Device def name=(nowa) @name = nowa prive.name = Corsair Marcin Młotkowski Programowanie w Ruby 10 / 40
Deklaracja akcesorów Deklaracja class Device attr reader :name Równoważne class Device def name @name Marcin Młotkowski Programowanie w Ruby 11 / 40
Modyfikatory Klasy i obiekty Zamiast pisać tak class Device def name=(nowa) @name = nowa Można napisać tak class Device attr writer :name Marcin Młotkowski Programowanie w Ruby 12 / 40
Akcesor odczyt/zapis class Device attr accessor :name Marcin Młotkowski Programowanie w Ruby 13 / 40
Atrybuty wirtualne Klasy i obiekty class Device attr reader :name def long name @type + ---> + @name Użycie puts prive.name puts prive.long name Marcin Młotkowski Programowanie w Ruby 14 / 40
Atrybuty wirtualne Klasy i obiekty Implementacja obiektu reprezentującego temperaturę class Temperatura attr reader :temperatura Marcin Młotkowski Programowanie w Ruby 15 / 40
Atrybuty wirtualne Klasy i obiekty Implementacja obiektu reprezentującego temperaturę class Temperatura attr reader :temperatura Skale temperaturowe: Celsius Kelvin Fahrenheit Reamur Marcin Młotkowski Programowanie w Ruby 15 / 40
Skale temperaturowe class Temperatura attr accessor :kelvin def celsius=(c) @kelvin = 273.15 + c def celsius return @kelvin - 273.15 def fahrenheit=(f) @kelvin = (f - 32) * (5/9) + 273.15 def fahrenheit return (@kelvin - 273.15)*(9/5) + 32 Marcin Młotkowski Programowanie w Ruby 16 / 40
Przykłady użycia Klasy i obiekty t = Temperatura.new t.kelvin = 273.15 puts Cels #{t.celsius}, fahr #{t.fahrenheit} Cels 0.0, fahr 32.0 Marcin Młotkowski Programowanie w Ruby 17 / 40
Metody singletonowe t = Temperatura.new t.kelvin = 273.15 Skala Reaumura def t.reaumur; (@kelvin - 273.15)*(5/4) puts t.reaumur Marcin Młotkowski Programowanie w Ruby 18 / 40
Zmienne i metody klasy (statyczne) class Device @@liczba = 0 def initialize @@liczba = @@liczba + 1 Marcin Młotkowski Programowanie w Ruby 19 / 40
Zmienne i metody klasy (statyczne) class Device @@liczba = 0 def initialize @@liczba = @@liczba + 1 def Device.licznik @@liczba.to s Marcin Młotkowski Programowanie w Ruby 19 / 40
Kontrola dostępu do pól i metod Zmienne klasy i obiektu są prywatne Metody klasy i obiektu są publiczne Marcin Młotkowski Programowanie w Ruby 20 / 40
Metody protected Klasy i obiekty Można korzystać w podklasach Można korzystać w metodach obiektów tej samej klasy Składnia class Device protected def scan def block protected :block Marcin Młotkowski Programowanie w Ruby 21 / 40
Metody prywatne Klasy i obiekty Można je wywoływać wyłącznie w postaci self.metoda prywatna Marcin Młotkowski Programowanie w Ruby 22 / 40
Deklarowanie podklasy class Printer < Device Marcin Młotkowski Programowanie w Ruby 23 / 40
Konstruktor w podklasie class Printer < Device def initialize(name, type, port) super(name, type) @port = port Marcin Młotkowski Programowanie w Ruby 24 / 40
Dziedziczenie i przykrywanie metod Przykład class Device def to s... class Printer < Device... iglowka = Printer.new( biurkowa, dot printer, PRN: ) puts iglowka # puts iglowka.to s Wynik biurkowa dot printer Marcin Młotkowski Programowanie w Ruby 25 / 40
Ulepszenie metody to s Pierwsza wersja class Printer < Device def to s super.to s + #{@port} Marcin Młotkowski Programowanie w Ruby 26 / 40
Ulepszenie metody to s Pierwsza wersja class Printer < Device def to s super.to s + #{@port} Druga wersja class Printer < Device def to s super + #{@port} Marcin Młotkowski Programowanie w Ruby 26 / 40
Na koniec o metodach Wszystkie metody są wirtualne. Marcin Młotkowski Programowanie w Ruby 27 / 40
Plan wykładu Klasy i obiekty 1 Klasy i obiekty 2 3 Marcin Młotkowski Programowanie w Ruby 28 / 40
Co to jest mixin Klasy i obiekty Mixin mechanizm włączania kodu modułu do deklaracji klasy Marcin Młotkowski Programowanie w Ruby 29 / 40
Przykład Klasy i obiekty Zadanie Zdefinowanie modułu do odczytywania stanu obiektu Marcin Młotkowski Programowanie w Ruby 30 / 40
Implementacja modułu module Debugger def snapshot puts Stan obiektu klasy #{self.class} for iv in self.instance variables puts #{iv} = #{self.instance variable get(iv)} Marcin Młotkowski Programowanie w Ruby 31 / 40
Wmiksowanie modułu do klasy class Drukarka < Device include Debugger... Marcin Młotkowski Programowanie w Ruby 32 / 40
Zastosowanie Klasy i obiekty lokalna = Drukarka.new( kuchenna, hp5000n, /dev/ ) lokalna.snapshot Marcin Młotkowski Programowanie w Ruby 33 / 40
Inne zastosowania Klasy i obiekty Moduł (mixin) Comparable implementuje operatory porównania <, <=, ==, >=, > i metodę between? wymaga implementacji operatora <=> Marcin Młotkowski Programowanie w Ruby 34 / 40
Zastosowanie modułu Comparable class Wektor include Comparable def <=> (awektor) # zwraca -1 gdy self< awektor, 0 lub 1 Zastosowanie w1 = Wektor.new([3, -4, 5]) w2 = Wektor.new([-5, 12, -2]) w1 < w1 w1 >= w2 Marcin Młotkowski Programowanie w Ruby 35 / 40
Plan wykładu Klasy i obiekty 1 Klasy i obiekty 2 3 Marcin Młotkowski Programowanie w Ruby 36 / 40
Wszystkie klasy są podklasami klasy Object Metody klasy Object class - klasa obiektu instance variables freeze to s i inne... Marcin Młotkowski Programowanie w Ruby 37 / 40
Zmiana implementacji istniejącej klasy class Fixnum def to s return Niespodzianka! puts 5 Marcin Młotkowski Programowanie w Ruby 38 / 40
Zagnieżdżanie klasy w klasie class A class InA x = A::InA.new Marcin Młotkowski Programowanie w Ruby 39 / 40
Dostęp indeksowany class MyArray def [](i) return Zażądano #{i} def []=(i, v) puts [#{i}]= #{v} arr = MyArray.new arr[234] arr[34] = 16 Marcin Młotkowski Programowanie w Ruby 40 / 40