Published on

Swiftda metodlar va Propertylarni Override qilish

Authors

Swift Inheritanceda subclass superclassning metodlari va propertylarini meros oladi. Bu subclasslarga superclass elementlariga to'g'ridan-to'g'ri murojaat qilish imkonini beradi.

Endi, agar bir xil metod ham superclassda, ham subclassda e'lon qilingan bo'lsa, subclassdagi metod superclassdagi metodning ustidan yoziladi. Bu overriding deyiladi.

Metod overriding e'lon qilish uchun override kalit so'zidan foydalanamiz. Masalan,

class Vehicle {
  
  func displayInfo(){
    ... 
  }
}

class Car: Vehicle {
  
  // metodning ustidan yozish
  override func displayInfo() {
    ... 
  }   
} 

Bu yerda Car subclassining displayInfo() metodi Vehicle superclassining bir xil metodining ustidan yoziladi.

Misol:

class Vehicle {

  // superclassdagi metod
  func displayInfo() {
    print("To'rt g'ildirakli yoki ikki g'ildirakli")
  }
}

// Car classi Vehicle classidan meros oladi
class Car: Vehicle {

  // displayInfo() metodining ustidan yozish
  override func displayInfo() {
    print("To'rt g'ildirakli")
  }
}

// subclassdan obyekt yaratish
var car1 = Car()

// displayInfo() metodini chaqirish
car1.displayInfo()

Natija:

To'rt g'ildirakli

Yuqoridagi misolda Car subclassi ichida Vehicle superclassining displayInfo() metodining ustidan yozyapmiz.

// Car classi ichida 
override func displayInfo() {
  print("To'rt g'ildirakli")
}

Bu yerda ustidan yozilayotgan metodini bildirish uchun override kalit so'zidan foydalandik.

Endi Car klassining car1 obyekti yordamida displayInfo() metodini chaqirganimizda,

car1.displayInfo()

subclass ichidagi metod chaqiriladi.

Bu shunday ishlaydi, chunki Car subclassining displayInfo() metodi Vehicle superclassining bir xil metodining ustidan yoziladi.

Override qilingan metodga murojaat

Subclassdan superclassning metodiga murojaat qilish uchun super kalit so'zidan foydalanamiz. Masalan,

class Vehicle {

  // superclassdagi metod
  func displayInfo() {
    print("Transport: To'rt g'ildirakli yoki ikki g'ildirakli")
  }
}

// Car classi Vehicle classidan meros oladi
class Car: Vehicle {

  // displayInfo() metodining ustidan yozish
  override func displayInfo() {

    // superclassning displayInfo() metodiga murojaat
    super.displayInfo()
    print("Mashina: To'rt g'ildirakli")
  }
}

// subclassdan obyekt yaratish
var car1 = Car()

// displayInfo() metodini chaqirish
car1.displayInfo()

Natija:

Transport: To'rt g'ildirakli yoki ikki g'ildirakli
Mashina: To'rt g'ildirakli

Yuqoridagi misolda Car subclassining displayInfo() metodi Vehicle superclassining bir xil metodining ustidan yoziladi.

Car ning displayInfo() ichida

// superclass metodini chaqirish
super.displayInfo()

dan foydalanib, Vehicle ning displayInfo() metodini chaqirdik.

Shunday qilib, car1 obyekti yordamida displayInfo() metodini chaqirganimizda

// displayInfo() metodini chaqirish
car1.displayInfo()
array ham override qilingan, ham superclass versiyasidagi displayInfo() metodlari bajariladi.

Metodning Override qilinishini oldini olish

Swiftda metodning override qilinishini oldini olish mumkin.

Metodning override qilinmasligi uchun superclassda metod e'lon qilishda final kalit so'zidan foydalanamiz. Masalan,

class Vehicle {

  // override qilishning oldini olish
  final func displayInfo() {
    print("To'rt g'ildirakli yoki ikki g'ildirakli")
  }
}

// Car classi Vehicle classidan meros oladi
class Car: Vehicle {

  // override qilishga urinish
  override func displayInfo() {
    print("To'rt g'ildirakli")
  }
}

// subclassdan obyekt yaratish
var car1 = Car()

// displayInfo() metodini chaqirish
car1.displayInfo()

Yuqoridagi misolda superclassdagi displayInfo() metodini final deb belgiladik.

Metod final deb e'lon qilingandan so'ng, uni override qila olmaymiz. Shuning uchun final metodning ustidan yozishga uringanimizda,

override func displayInfo() {
  print("To'rt g'ildirakli")
}

xato xabari olamiz: error: instance method overrides a 'final' instance method.

Propertylarini Override qilish

Swiftda computed propertylarning ustidan yozish mumkin. Masalan,

class University {

  // computed property
  var cost: Int {
    return 5000
  }
}

class Fee: University {
  // computed propertyning ustidan yozish
  override var cost: Int {
    return 10000
  }
}

var amount = Fee()

// cost propertyga murojaat
print("Yangi to'lov:", amount.cost)

Natija:

Yangi to'lov: 10000

Yuqoridagi misolda University superclassi ichida computed property yaratdik. Fee subclassi ichidagi kodga e'tibor bering:

override var cost: Int {
  return 10000 
} 

Biz cost computed propertyning ustidan yozyapmiz. Endi Fee ning amount obyekti yordamida cost propertyga murojaat qilganimizda,

// cost propertyga murojaat
amount.cost

subclass ichidagi property chaqiriladi.

Swiftda stored propertylarning ustidan yozib bo'lmaydi. Masalan,

class A {
  // stored property
  var num = 0
}

class B: A {
  // stored propertyning ustidan yozishga urinish 
  override var num = 2    // Xato kod
}