ไหนๆ เขียนเรื่อง 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 มาใส่ไว้ใ inherite น 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
Post new comment