วันจันทร์, กันยายน 08, 2551

Object inheritance ของ ruby

ไหนๆ เขียนเรื่อง Object แล้วถ้าไม่เขียนเรื่อง Inheritance, include module ก็จะไม่ครบวงจร การสืบทอดความสามารถของ class แม่ในภาษา ruby ใช้เครื่องหมาย "<" เป็นสัญลักษณ์ประมาณว่า เอาความสามารถของด้านขวาไปใส่ด้านซ้าย

class Circle
  attr_accessor :circle, :radious
  class << self; attr_accessor :count end
end

class Ring < Circle
end

ring = Ring.new
ring.circle = 5
puts ring.circle #=> 5
Ring.count = 3
Circle.count = 8
puts Ring.count #=> 3
puts Circle.count #=> 8  

จากตัวอย่าง Ring ได้คุณสมบัติทุกอย่างจาก Circle ทั้ง class level และ instance level แต่ไม่ได้ ใช้ค่าของ count ร่วมกัน หากต้องการให้ใช้ร่วมกันเราต้องเขียนความสัมพันธ์ขึ้นมาเอง เช่น

class Ring < Circle
  def count=(c)
    Circle.count = c  
  end
end

ใน ruby ยังมีการดึงคุณสมบัติอีกแบบโดยการ include module

module Sing   
  def wing     
    "Say wing!!"    
  end 
end  

class Circle   
  include Sing 
end  

circle = Circle.new 
circle.wing 

การ include module ก็คล้ายกับการเอา code ใน module มาใส่ไว้ใน class ช่วยลดการเขียนที่ทำซ้ำๆ กันในแต่ละ Object ได้มากทีเดียว อย่าลืมว่า Object ของ ruby จะ inherit ได้แค่ Object เดียว ถ้าต้องการมากกว่านั้นก็มา include เอา (ส่วน concept ของการเลือก include หรือ inherit ไว้ค่อยเขียนกันอีกที)

เมื่อเราเรียก method wing ใน class Circle สิ่งที่ ruby ทำคือไปหา method wing ใน Circle ก่อน หากไม่เจอ จึงไปหาใน module โดยไล่จากตัวสุดท้ายไปหาตัวแรก เมื่อไม่เจอใน module จึงขึ้นไปหาที่ Super class ของ circle ต่อไป แล้วตามไปหาใน module ของ circle เป็นลำดับ ไปจนสิ่นสุดที่ Object

ที่มา -- railstips.org 
blog comments powered by Disqus