Object inheritance ของ ruby
ไหนๆ เขียนเรื่อง Object แล้วถ้าไม่เขียนเรื่อง Inheritance, include module ก็จะไม่ครบวงจร การสืบทอดความสามารถของ class แม่ในภาษา ruby ใช้เครื่องหมาย "<" เป็นสัญลักษณ์ประมาณว่า เอาความสามารถของด้านขวาไปใส่ด้านซ้าย
จากตัวอย่าง Ring ได้คุณสมบัติทุกอย่างจาก Circle ทั้ง class level และ instance level แต่ไม่ได้ ใช้ค่าของ count ร่วมกัน หากต้องการให้ใช้ร่วมกันเราต้องเขียนความสัมพันธ์ขึ้นมาเอง เช่น
ใน ruby ยังมีการดึงคุณสมบัติอีกแบบโดยการ include module
การ 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
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
ความคิดเห็น
โพสต์ความคิดเห็น