суббота, 4 августа 2007 г.

Ruby : Коротко об ООП

ООП в Ruby заслуживает уважения, оно гораздо мощнее и шире нежели в PHP5 и тем более PHP4, по-этому моё знакомство с этим языком не может не обойтись без рассмотрения принципов работы объектов в этом языке.

Следуя документации Ruby рассмотрим пример простого класса :

class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
end

Название класса начинается с заглавной буквы, а методы с маленькой :) , метод initialize аналогичен методу __construct в php, он исполняется в момент когда создают копию объекта.

Создать объект довольно просто:

aSong = Song.new("Stargazers", "Rainbow", 260)

Так же руби позволяет делать дамп объекта специальным методом inspect

aSong.inspect » "#Song:0x401b4924 @duration=260, @artist='Rainbow', @name='Stargazers'"

Если нам нужно наладить дамп объекта в другом формате для этого есть специальный метод to_s:

aSong.to_s » "#Song:0x401b499c"

Так как по дефолту это выводит лишь ID объекта мы можем переписать метод :)

class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end

def to_s
"Song: #{@name}--#{@artist} (#{@duration})"
end
end
aSong = Song.new("Stargazer", "Rainbow", 260)
aSong.to_s » "Song: Stargazer--Rainbow(260)"

Родительские классы в Ruby рассмотрим на следующем примере:

class Song

def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end

def to_s
"Song: #{@name}--#{@artist} (#{@duration})"
end
end

class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
end



Как вы заметили мы создали второй класс KaraokeSong и указали ему родительский класс Song. Для вызова initialize метода родительского мы используем super(). Все это видно из примера выше :)

super это очень интересная вещь ;) Он сообщает родительскому классу о том, что нужно вызвать метод с тем же именем из которого и был вызов super, в нашем примере мы вызываем super из метода initialize класса KaraokeSong в свою очередь super даёт задание вызвать метод initialize в классеSong, так как он родительский :)

Комментариев нет: