Programowanie w Ruby Wykład 4 Marcin Młotkowski 28 października 2016
Plan wykładu Klasy i obiekty 1 Klasy i obiekty 2 3 Marcin Młotkowski Programowanie w Ruby 2 / 41
Deklaracja klasy Klasy i obiekty class Device Marcin Młotkowski Programowanie w Ruby 3 / 41
Konstruktor Klasy i obiekty class Device def initialize(name, type) @name = name @type = type Marcin Młotkowski Programowanie w Ruby 4 / 41
Deklaracja metody Klasy i obiekty class Device def initialize(name, type)... def to s @name + + @type Marcin Młotkowski Programowanie w Ruby 5 / 41
Utworzenie obiektu Klasy i obiekty prive = Device.new( /dev/sdc, kingston ) puts prive.to s Marcin Młotkowski Programowanie w Ruby 6 / 41
Dygresja Klasy i obiekty Konwencja # równoważne: puts prive.to s puts prive Marcin Młotkowski Programowanie w Ruby 7 / 41
Klasy i obiekty Zmienne obiektu (zmienne instancyjne) Składnia @nazwa Zmienne instancyjne są prywatne. Marcin Młotkowski Programowanie w Ruby 8 / 41
Klasy i obiekty Dostęp do zmiennych obiektu (akcesory) class Device def name @name def zmien nazwe(nowa) @name = nowa Marcin Młotkowski Programowanie w Ruby 9 / 41
Inny modyfikator Klasy i obiekty class Device def name=(nowa) @name = nowa prive.name = Corsair Marcin Młotkowski Programowanie w Ruby 10 / 41
Klasy i obiekty Deklaracja akcesorów Deklaracja class Device attr reader :name Równoważne class Device def name @name Marcin Młotkowski Programowanie w Ruby 11 / 41
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 / 41
Klasy i obiekty Akcesor odczyt/zapis class Device attr accessor :name Marcin Młotkowski Programowanie w Ruby 13 / 41
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 / 41
Atrybuty wirtualne Klasy i obiekty Implementacja obiektu reprezentującego temperaturę class Temperatura attr reader :temperatura Marcin Młotkowski Programowanie w Ruby 15 / 41
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 / 41
Klasy i obiekty 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 / 41
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 / 41
Klasy i obiekty 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 / 41
Klasy i obiekty Zmienne i metody klasy (statyczne) class Device @@liczba = 0 def initialize @@liczba = @@liczba + 1 Marcin Młotkowski Programowanie w Ruby 19 / 41
Klasy i obiekty 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 / 41
Klasy i obiekty 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 / 41
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 / 41
Metody prywatne Klasy i obiekty Można je wywoływać wyłącznie w postaci self.metoda prywatna Marcin Młotkowski Programowanie w Ruby 22 / 41
Klasy i obiekty Deklarowanie podklasy class Printer < Device Marcin Młotkowski Programowanie w Ruby 23 / 41
Klasy i obiekty Konstruktor w podklasie class Printer < Device def initialize(name, type, port) super(name, type) @port = port Marcin Młotkowski Programowanie w Ruby 24 / 41
Klasy i obiekty 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 / 41
Klasy i obiekty Ulepszenie metody to s Pierwsza wersja class Printer < Device def to s super.to s + #{@port} Marcin Młotkowski Programowanie w Ruby 26 / 41
Klasy i obiekty 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 / 41
Klasy i obiekty Na koniec o metodach Wszystkie metody są wirtualne. Marcin Młotkowski Programowanie w Ruby 27 / 41
Plan wykładu Klasy i obiekty 1 Klasy i obiekty 2 3 Marcin Młotkowski Programowanie w Ruby 28 / 41
Co to jest mixin Klasy i obiekty Mixin mechanizm włączania kodu modułu do deklaracji klasy Marcin Młotkowski Programowanie w Ruby 29 / 41
Przykład Klasy i obiekty Zadanie Zdefinowanie modułu do odczytywania stanu obiektu Marcin Młotkowski Programowanie w Ruby 30 / 41
Klasy i obiekty 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 / 41
Klasy i obiekty Wmiksowanie modułu do klasy class Drukarka < Device include Debugger... Marcin Młotkowski Programowanie w Ruby 32 / 41
Zastosowanie Klasy i obiekty lokalna = Drukarka.new( kuchenna, hp5000n, /dev/ ) lokalna.snapshot Marcin Młotkowski Programowanie w Ruby 33 / 41
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 / 41
Klasy i obiekty 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 / 41
Plan wykładu Klasy i obiekty 1 Klasy i obiekty 2 3 Marcin Młotkowski Programowanie w Ruby 36 / 41
Klasy i obiekty 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 / 41
Chwila rozrywki Klasy i obiekty (irb)> 5.class Fixnum Marcin Młotkowski Programowanie w Ruby 38 / 41
Chwila rozrywki Klasy i obiekty (irb)> 5.class Fixnum (irb)> 5.class.class Class Marcin Młotkowski Programowanie w Ruby 38 / 41
Chwila rozrywki Klasy i obiekty (irb)> 5.class Fixnum (irb)> 5.class.class Class (irb)> 5.class.class.class Class Marcin Młotkowski Programowanie w Ruby 38 / 41
Klasy i obiekty Zmiana implementacji istniejącej klasy class Fixnum def to s return Niespodzianka! puts 5 Marcin Młotkowski Programowanie w Ruby 39 / 41
Klasy i obiekty Zagnieżdżanie klasy w klasie class A class InA x = A::InA.new Marcin Młotkowski Programowanie w Ruby 40 / 41
Klasy i obiekty 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 41 / 41