Kotlin Merosxurlik (Sinf/Class)

Obyektga yo'naltirilgan dasturlashning eng muhim xususiyatlaridan biri merosxo'rlikdir. Meroslash kodni qayta ishlatish imkonini beradi, u mavjud sinf (asosiy sinf) ning barcha xususiyatlarini yangi sinfga (hosil sinf) meros qilib olish imkonini beradi. Bundan tashqari, olingan sinf o'ziga xos xususiyatlarni ham qo'shishi mumkin.

Meros sintaksisi:

open class baseClass (x:Int ) {
      ..........
}
class derivedClass(x:Int) : baseClass(x) {
     ...........
}

Kotlinda barcha sinflar sukut bo'yicha yakuniy hisoblanadi. Olingan sinfning asosiy sinfdan meros bo'lishiga ruxsat berish uchun biz asosiy sinf oldida ochiq kalit so'zdan foydalanishimiz kerak .

Kotlin Asosiy sinfdan xossa va usullarni meros qilib olish:

Agar biz sinfni meros qilib olsak, barcha xususiyatlar va funksiyalar ham meros qilib olinadi. Biz olingan sinfdagi asosiy sinf o'zgaruvchilari va funktsiyalaridan foydalanishimiz mumkin, shuningdek, olingan sinf obyekti yordamida funktsiyalarni chaqirishimiz mumkin. 

open class baseClass{
	val name = "Uzbekdevs sayti"
	fun A(){
		println("Asosiy sinf")
	}
}
class derivedClass: baseClass() {
	fun B() {
		println(name)		 
		println("Olingan sinf")
	}
}
fun main(args: Array<String>) {
	val derived = derivedClass()
	derived.A()		 
	derived.B()	
}
Asosiy sinf Uzbekdevs sayti Olingan sinf

Izoh: Bu yerda bizda asosiy sinf va hosila sinf mavjud. Biz olingan sinfni yaratishda obyektni yaratamiz, keyin u asosiy sinf va hosila sinf funktsiyalarini chaqirish uchun ishlatiladi. Olingan A() “Asosiy sinf” ni chop etuvchi A() funksiyasini chaqirish uchun ishlatiladi. Derived.B() B() funktsiyasini chaqirish uchun ishlatiladi, u asosiy sinfdan meros bo'lib o'tgan o'zgaruvchi nomini va shuningdek, "Olingan sinf" ni chop etadi. 

Merosdan foydalanish

Aytaylik, kompaniyada uch turdagi xodimlar mavjud: webDeveloper, iOSDeveloper va androidDeveloper. Ularning barchasi ism, yosh kabi umumiy xususiyatlarga ega va shuningdek, ba'zi bir maxsus ko'nikmalarga ega. Birinchidan, biz uchta sinfni individual ravishda yaratamiz va barcha xodimlar umumiy va o'ziga xos ko'nikmalarga ega.

Bu yerda ularning barchasining ismi va yoshi bor, ammo uchta ishlab chiquvchining rivojlanish qobiliyati har xil. Har bir sinfda biz har bir belgi uchun ism va yosh uchun bir xil kodni nusxalashtiramiz. Agar biz ish haqi() funksiyasini qo'shmoqchi bo'lsak, biz uchta sinfda bir xil kodni nusxalashimiz kerak. Bu bizning dasturimizda kodning bir qancha dublikat nusxalarini yaratadi va bu yanada murakkab va tartibsiz kodga olib kelishi mumkin. Merosdan foydalangan holda, vazifa osonroq bo'ladi. Biz yangi asosiy toifadagi xodimni yaratishimiz mumkin. 3 ta asl sinfning umumiy xususiyatlarini o'z ichiga oladi. Keyinchalik bu uchta sinf asosiy sinfdan umumiy xususiyatlarni meros qilib olishi va o'ziga xos xususiyatlarni qo'shishi mumkin. Biz ishchilar sinfida ish haqi xususiyatini ikki nusxadagi nusxalarsiz osongina qo'shishimiz mumkin .

Bu yerda, webDeveloper uchun biz asosiy sinfdagi barcha xususiyatlarni va sinfdagi o'zining veb-sayti() funksiyalarini meros qilib olamiz. Xuddi shunday, biz boshqa ikkita sinf uchun ham xuddi shunday qilishimiz mumkin androidDeveloper va iosDeveloper. Bu bizning kodimizni yanada tushunarli va kengaytiriladigan qiladi.

Kotlin meros dasturi   

open class Employee( name: String,age: Int,salary : Int) {
    init {
        println("Mening ismim $name, $age yoshda va oyiga $salary maosh olaman. ")
    }
}
class webDeveloper( name: String,age: Int,salary : Int): Employee(name, age,salary) {
    fun website() {
        println("Men veb-sayt ishlab chiquvchisiman.")
        println()
    }
}
class androidDeveloper( name: String,age: Int,salary : Int): Employee(name, age,salary) {
    fun android() {
        println("Men Android ilovalarini ishlab chiquvchiman.")
        println()
    }
}
class iosDeveloper( name: String,age: Int,salary : Int): Employee(name, age,salary) {
    fun iosapp() {
        println("Men iOS ilovalarini ishlab chiquvchiman.")
        println()
    }
}
fun main(args: Array<String>) {
    val wd = webDeveloper("Sherzod", 25, 10000)
    wd.website()
    val ad = androidDeveloper("Anvar", 24,12000)
    ad.android()
    val iosd = iosDeveloper("Asil", 26,15000)
    iosd.iosapp()
}
Mening ismim Sherzod, 25 yoshda va oyiga 10000 maosh olaman. Men veb-sayt ishlab chiqaruvchisiman. Mening ismim Anvar, 24 yoshda va oyiga 12000 maosh olaman. Men Android ilovalarini ishlab chiquvchiman. Mening ismim Asil, 26 yoshda va oyiga 15000 maosh olaman. Men iOS ilovalarini ishlab chiquvchiman.

Izoh: Bu yerda bizda ochilgan kalit so‘z bilan prefikslangan, hosila sinflarning umumiy xossalarini o‘z ichiga olgan xodimning asosiy sinfi mavjud. Xodimlar sinfida uchta o'zgaruvchiga ega bo'lgan asosiy konstruktor mavjud " ism, yosh va ish haqi". Shuningdek, uchta hosilaviy sinflar mavjud webDeveloper, androidDeveloper va iosDeveloper, ular ham asosiy konstruktorlarni o'z ichiga oladi va ularning barchasi uchta o'zgaruvchiga ega. Birinchidan, biz obyektni yaratamiz webDeveloper sinfi uchun va olingan sinfga parametr sifatida ism, yosh va ish haqini o'tkazing. U mahalliy o'zgaruvchilarni ishga tushiradi va bu qiymatlarni asosiy sinfga o'tkazadi. Keyin, standart chiqishga satrni chop etadigan "wd" obyekti yordamida veb-sayt() a'zo funktsiyasini chaqiramiz. Xuddi shunday, biz qolgan ikkita sinf uchun ob'ektlar yaratamiz va ularning tegishli a'zo funktsiyalarini chaqiramiz. 

Kotlin merosining asosiy konstruktori:

Agar olingan sinf asosiy konstruktorni o'z ichiga olgan bo'lsa, biz olingan sinf parametrlari yordamida asosiy sinf konstruktorini ishga tushirishimiz kerak. Quyidagi dasturda asosiy sinfning asosiy konstruktorida ikkita parametr va olingan sinfda uchta parametr mavjud.

Kotlin dasturi:  

open class Employee(name: String,age: Int) {
    init{
        println("Xodimning ismi $name")
        println("xodimning yoshi $age")
    }
}
class CEO( name: String, age: Int, salary: Double): Employee(name,age) {
    init {
        println("Yillik ish haqi $salary mln")
    }
}
fun main(args: Array<String>) {
    CEO("Sherzod", 19, 450.00)
}
Xodimning ismi Sherzod Xodimning yoshi 19 Yillik ish haqi 450,0 mln

Izoh: Bu yerda biz olingan sinf rahbarini yaratamiz va parametr qiymatlari nomi, yoshi va ish haqiga o'tdik. Olingan sinfning mahalliy o'zgaruvchilari tegishli qiymatlar bilan ishga tushiriladi va o'zgaruvchining nomi va yoshini parametr sifatida Xodimlar sinfiga o'tkazadi. Xodimlar sinfi o'zgaruvchining nomlari va qiymatlarini standart chiqishga chiqaradi va boshqaruvni olingan sinfga qaytaradi. Keyin olingan sinf println() operatorini bajaradi va chiqadi. 

Kotlin merosining ikkinchi darajali konstruktori:

Agar hosila sinfda birlamchi konstruktor bo'lmasa, super kalit so'zdan foydalanib, asosiy sinfni ikkinchi darajali konstruktordan olingan sinfning ikkinchi darajali konstruktoridan chaqirishimiz kerak. Biz, shuningdek, olingan sinf parametrlaridan foydalanib, asosiy sinfning ikkinchi darajali konstruktorini ishga tushirishimiz kerak. 

Kotlin dasturi: 

open class Employee {
    constructor(name: String,age: Int){
            println("Xodimning ismi $name")
            println("Xodimning yoshi $age yoshda")
    }
}
class CEO : Employee{
    constructor( name: String,age: Int, salary: Double): super(name,age) {
        println("Yillik ish haqi $salary mln dollar")
    }
}
fun main(args: Array<String>) {
    CEO("Sherzod", 19, 250.00)
}
Xodimning ismi Sherzod Xodimning yoshi 19 yoshda Yillik ish haqi 250,0 million dollar

Izoh: Bu yerda biz sinf rahbarini ishga tushiramiz va parametr qiymatlarini ikkinchi darajali konstruktorga o'tkazamiz. U mahalliy o'zgaruvchilarni ishga tushiradi va super (ism, yosh) yordamida asosiy sinf xodimga o'tadi. 

A'zo funktsiyalari va xususiyatlarini bekor qilish:

Agar asosiy sinf va hosila sinf bir xil nomdagi a'zo funksiyani o'z ichiga olgan bo'lsa, biz override kalit so'zidan foydalanib, hosila sinfdagi asosiy a'zo funktsiyasini bekor qilishimiz mumkin va shuningdek, asosiy sinfning a'zo funktsiyasini ochiq kalit so'z bilan belgilashimiz kerak.

A'zo funktsiyasini bekor qilish uchun Kotlin dasturi:

open class Animal {
    open fun run() {
        println("Hayvonlar yugurishi mumkin.")
    }
}
class Tiger: Animal() {
    override fun run() {       
        println("Yo'lbars juda tez yugurishi mumkin.")
    }
}
fun main(args: Array<String>) {
    val t = Tiger()
    t.run()
}
Yo'lbars juda tez yugurishi mumkin.

Xuddi shunday, biz olingan sinfdagi asosiy sinfning xususiyatini bekor qilishimiz mumkin.

A'zo mulkini bekor qilish uchun Kotlin dasturi:

open class Animal {
    open var name: String = "It"
    open var speed = "40 km/h" 
}
class Tiger: Animal() {
    override var name = "Yo'lbars"
    override var speed = "100 km/h"
}
fun main(args: Array<String>) {
    val t = Tiger()
    println(t.name+" soatiga "+t.speed " tezlikda yugura oladi.")
}
Yo'lbars soatiga 100 km/h tezlikda yugura oladi.