Merosxo’rlik (inheritance) — OOP ning ikkinchi ustuni. U bir sinfga boshqa sinfning barcha metod va xususiyatlarini “meros qilib olish” imkonini beradi. Bu kod takrorlanishini kamaytiradi va sinflarni mantiqiy iyerarxiyaga soladi.
Merosxo’rlik — bir sinf (bola) boshqa sinf (ota) ning metodlarini o’zlashtirishi. Ruby’da
class Bola < Otashaklida yoziladi. Bola ota imkoniyatlarining barchasini oladi, ustiga o’zinikini qo’shadi.
Asosiy va bola sinf
Umumiy Inson sinfi va undan meros oluvchi Talabani ko’ramiz:
class Inson
def initialize(ism)
@ism = ism
end
def tanishtir
puts "Men #{@ism}"
end
end
class Talaba < Inson
def initialize(ism, ball)
super(ism)
@ball = ball
end
def malumot
puts "Ball: #{@ball}"
end
end
t = Talaba.new("Master Sherkulov", 95)
t.tanishtir
t.malumot
Men Master Sherkulov
Ball: 95
class Talaba < Inson — Talabani Insondan meros qildi. t.tanishtir — bu metod Talabada yozilmagan, lekin Insondan meros bo’lgani uchun ishladi. malumot esa faqat Talabaga xos, yangi metod.
super — ota metodini chaqirish
super kalit so’zi ota sinfdagi bir xil nomli metodni chaqiradi. Yuqoridagi misolda super(ism) — Inson#initializeni chaqirib, @ismni o’rnatish vazifasini otaga topshirdi. superni parametrsiz metodlarda ham ishlatish mumkin:
class Hayvon
def ovoz
puts "Nimadir ovoz chiqardi"
end
end
class Mushuk < Hayvon
def ovoz
super
puts "...aslida bu Miyov edi"
end
end
Mushuk.new.ovoz
Nimadir ovoz chiqardi
...aslida bu Miyov edi
super (qavssiz) — ota metodini aynan shu argumentlar bilan chaqiradi. Mushuk#ovoz avval ota versiyasini ishga tushirdi, so’ng o’zining qo’shimcha qatorini bajardi — ikkalasi birga ishladi, biri ikkinchisini butunlay almashtirmadi.
Metodni qayta yozish (override)
Bola sinf ota metodini butunlay o’ziniki bilan almashtirishi ham mumkin — super chaqirmasdan:
class Hayvon
def ovoz
puts "Noma'lum ovoz"
end
end
class It < Hayvon
def ovoz
puts "Vov"
end
end
Hayvon.new.ovoz
It.new.ovoz
Noma'lum ovoz
Vov
It#ovoz super chaqirmagani uchun ota versiyasi umuman ishlamadi — bu safar to’liq almashtirish (override) bo’ldi.
Meros zanjirini tekshirish
Har qanday obyektning butun meros zanjirini ancestors orqali ko’rish mumkin:
puts It.ancestors.first(3).inspect
puts It.new.is_a?(Hayvon)
puts It.superclass
[It, Hayvon, Object]
true
Hayvon
ancestors — sinfning butun meros zanjirini ko’rsatadi (Object — Ruby’da barcha sinflarning eng tub otasi). is_a? obyekt ma’lum sinfdan (yoki uning avlodidan) ekanini tekshiradi, superclass esa bevosita otani qaytaradi.