Darsliklar Ruby Merosxo'rlik

Ruby Ruby Merosxo'rlik

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 < Ota shaklida 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.