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’rlikbir 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 < InsonTalabani 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.