Swift - มรดก

ความสามารถในการรับมากกว่ารูปแบบถูกกำหนดให้เป็นมรดก โดยทั่วไปคลาสสามารถสืบทอดวิธีการคุณสมบัติและฟังก์ชันจากคลาสอื่นได้ ชั้นเรียนสามารถแบ่งออกเป็นคลาสย่อยและระดับซุปเปอร์

  • Sub Class - เมื่อคลาสสืบทอดคุณสมบัติวิธีการและฟังก์ชันจากคลาสอื่นจะเรียกว่าคลาสย่อย

  • Super Class - คลาสที่มีคุณสมบัติวิธีการและฟังก์ชันในการสืบทอดคลาสอื่น ๆ จากตัวมันเองเรียกว่าคลาสซุปเปอร์

คลาส Swift 4 ประกอบด้วย superclass ซึ่งเรียกและเข้าถึงวิธีการคุณสมบัติฟังก์ชันและวิธีการลบล้าง นอกจากนี้ผู้สังเกตการณ์คุณสมบัติยังใช้เพื่อเพิ่มคุณสมบัติและแก้ไขวิธีการคุณสมบัติที่จัดเก็บหรือคำนวณ

คลาสพื้นฐาน

คลาสที่ไม่สืบทอดเมธอดคุณสมบัติหรือฟังก์ชันจากคลาสอื่นเรียกว่า 'คลาสฐาน'

class StudDetails {
   var stname: String!
   var mark1: Int!
   var mark2: Int!
   var mark3: Int!
   
   init(stname: String, mark1: Int, mark2: Int, mark3: Int) {
      self.stname = stname
      self.mark1 = mark1
      self.mark2 = mark2
      self.mark3 = mark3
   }
}

let stname = "Swift 4"
let mark1 = 98
let mark2 = 89
let mark3 = 76

print(stname)
print(mark1)
print(mark2)
print(mark3)

เมื่อเรารันโปรแกรมข้างต้นโดยใช้สนามเด็กเล่นเราจะได้ผลลัพธ์ดังนี้ -

Swift 4
98
89
76

คลาสที่มีชื่อคลาส StudDetails ถูกกำหนดให้เป็นคลาสพื้นฐานที่นี่ซึ่งใช้เพื่อบรรจุชื่อนักเรียนและสามวิชาทำเครื่องหมายเป็น mark1, mark2 และ mark3 คำหลัก 'let' ใช้เพื่อเริ่มต้นค่าสำหรับคลาสฐานและค่าคลาสพื้นฐานจะแสดงในสนามเด็กเล่นด้วยความช่วยเหลือของฟังก์ชัน 'พิมพ์'

คลาสย่อย

การสร้างคลาสใหม่บนคลาสที่มีอยู่ถูกกำหนดให้เป็น 'คลาสย่อย' คลาสย่อยสืบทอดคุณสมบัติวิธีการและฟังก์ชันของคลาสฐาน ในการกำหนดคลาสย่อย ':' จะใช้ก่อนชื่อคลาสฐาน

class StudDetails {
   var mark1: Int;
   var mark2: Int;
   
   init(stm1:Int, results stm2:Int) {
      mark1 = stm1;
      mark2 = stm2;
   }
   func print() {
      print("Mark1:\(mark1), Mark2:\(mark2)")
   }
}

class display : StudDetails {
   init() {
      super.init(stm1: 93, results: 89)
   }
}

let marksobtained = display()
marksobtained.print()

เมื่อเรารันโปรแกรมข้างต้นโดยใช้สนามเด็กเล่นเราจะได้ผลลัพธ์ดังนี้ -

Mark1:93, Mark2:89

คลาส 'StudDetails' ถูกกำหนดให้เป็นคลาสระดับสูงที่มีการประกาศเครื่องหมายนักเรียนและ 'display' คลาสย่อยจะใช้เพื่อสืบทอดเครื่องหมายจากคลาสระดับสูง ชั้นเรียนย่อยกำหนดเครื่องหมายนักเรียนและเรียกใช้เมธอด print () เพื่อแสดงเครื่องหมายนักเรียน

การลบล้าง

การเข้าถึงอินสแตนซ์ซูเปอร์คลาสเมธอดประเภทอินสแตนซ์คุณสมบัติชนิดและคลาสย่อยตัวห้อยให้แนวคิดของการลบล้าง คีย์เวิร์ด 'override' ถูกใช้เพื่อแทนที่เมธอดที่ประกาศในซูเปอร์คลาส

เข้าถึง Super class Methods, Properties และ Subscripts

คำหลัก 'super' ใช้เป็นคำนำหน้าเพื่อเข้าถึงเมธอดคุณสมบัติและตัวห้อยที่ประกาศในคลาสระดับสูง

การลบล้าง เข้าถึงเมธอดคุณสมบัติและตัวห้อย
วิธีการ super.somemethod ()
คุณสมบัติ super.someProperty ()
Subscripts สุดยอด [someIndex]

วิธีการลบล้าง

อินสแตนซ์และเมธอดประเภทที่สืบทอดมาสามารถแทนที่ได้โดยคีย์เวิร์ด 'override' สำหรับเมธอดของเราที่กำหนดไว้ในคลาสย่อยของเรา ที่นี่ print () ถูกแทนที่ในคลาสย่อยเพื่อเข้าถึงคุณสมบัติ type ที่กล่าวถึงใน super class print () นอกจากนี้อินสแตนซ์ใหม่ของระดับซูเปอร์คริกเก็ต () ถูกสร้างเป็น 'cricinstance'

class cricket {
   func print() {
      print("Welcome to Swift 4 Super Class")
   }
}

class tennis: cricket {
   override func print() {
      print("Welcome to Swift 4 Sub Class")
   }
}

let cricinstance = cricket()
cricinstance.print()

let tennisinstance = tennis()
tennisinstance.print()

เมื่อเรารันโปรแกรมข้างต้นโดยใช้สนามเด็กเล่นเราจะได้ผลลัพธ์ดังนี้ -

Welcome to Swift Super Class
Welcome to Swift Sub Class

การลบล้างทรัพย์สิน

คุณสามารถแทนที่อินสแตนซ์หรือคุณสมบัติคลาสที่สืบทอดมาเพื่อจัดเตรียม getter และ setter ที่กำหนดเองของคุณเองสำหรับคุณสมบัตินั้นหรือเพิ่มผู้สังเกตการณ์คุณสมบัติเพื่อเปิดใช้งานคุณสมบัติการลบล้างเพื่อสังเกตเมื่อค่าคุณสมบัติพื้นฐานเปลี่ยนแปลง

การลบล้างตัวรับและผู้ตั้งค่าทรัพย์สิน

Swift 4 ช่วยให้ผู้ใช้สามารถกำหนด getter และ setter ที่กำหนดเองเพื่อแทนที่คุณสมบัติที่สืบทอดมาไม่ว่าจะเป็นคุณสมบัติที่จัดเก็บหรือคำนวณ คลาสย่อยไม่ทราบชื่อและประเภทคุณสมบัติที่สืบทอดมา ดังนั้นจึงจำเป็นอย่างยิ่งที่ผู้ใช้จะต้องระบุในคลาสย่อยชื่อและประเภทของคุณสมบัติการลบล้างที่ระบุในซูเปอร์คลาส

สามารถทำได้สองวิธี -

  • เมื่อกำหนด setter สำหรับการลบล้างคุณสมบัติผู้ใช้ต้องกำหนด getter ด้วย

  • เมื่อเราไม่ต้องการแก้ไข getter คุณสมบัติที่สืบทอดมาเราก็สามารถส่งผ่านค่าที่สืบทอดมาโดยไวยากรณ์ 'super.someProperty' ไปยังคลาส super

class Circle {
   var radius = 12.5
   var area: String {
      return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

เมื่อเรารันโปรแกรมข้างต้นโดยใช้สนามเด็กเล่นเราจะได้ผลลัพธ์ดังนี้ -

Radius of rectangle for 25.0  is now overridden as 3

การลบล้างผู้สังเกตการณ์ทรัพย์สิน

เมื่อต้องเพิ่มคุณสมบัติใหม่สำหรับคุณสมบัติที่สืบทอดแนวคิด 'การแทนที่คุณสมบัติ' จะถูกนำมาใช้ใน Swift 4 สิ่งนี้จะแจ้งให้ผู้ใช้ทราบเมื่อค่าคุณสมบัติที่สืบทอดมามีการเปลี่ยนแปลง แต่การลบล้างไม่สามารถใช้ได้กับคุณสมบัติที่เก็บค่าคงที่ที่สืบทอดมาและคุณสมบัติที่คำนวณแบบอ่านอย่างเดียวที่สืบทอดมา

class Circle {
   var radius = 12.5
   var area: String {
     return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

class Square: Rectangle {
   override var radius: Double {
      didSet {
         print = Int(radius/5.0)+1
      }
   }
}

let sq = Square()
sq.radius = 100.0
print("Radius \(sq.area)")

เมื่อเรารันโปรแกรมข้างต้นโดยใช้สนามเด็กเล่นเราจะได้ผลลัพธ์ดังนี้ -

Radius of rectangle for 25.0  is now overridden as 3
Radius of rectangle for 100.0  is now overridden as 21

คุณสมบัติขั้นสุดท้ายเพื่อป้องกันการลบล้าง

เมื่อผู้ใช้ไม่ต้องการให้ผู้อื่นเข้าถึงเมธอดระดับสูงคุณสมบัติหรือตัวห้อย Swift 4 จะแนะนำคุณสมบัติ 'สุดท้าย' เพื่อป้องกันการลบล้าง เมื่อมีการประกาศคุณสมบัติ 'final' แล้วตัวห้อยจะไม่อนุญาตให้แทนที่เมธอดระดับสูงคุณสมบัติและตัวห้อยของมัน ไม่มีข้อกำหนดให้มีคุณสมบัติ 'สุดท้าย' ใน 'ระดับซุปเปอร์คลาส' เมื่อประกาศคุณสมบัติ 'สุดท้าย' ผู้ใช้จะถูก จำกัด ให้สร้างคลาสย่อยเพิ่มเติม

final class Circle {
   final var radius = 12.5
   var area: String {
      return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

class Square: Rectangle {
   override var radius: Double {
      didSet {
         print = Int(radius/5.0)+1
      }
   }
}

let sq = Square()
sq.radius = 100.0
print("Radius \(sq.area)")

เมื่อเรารันโปรแกรมข้างต้นโดยใช้สนามเด็กเล่นเราจะได้ผลลัพธ์ดังนี้ -

<stdin>:14:18: error: var overrides a 'final' var
override var area: String {
^
<stdin>:7:9: note: overridden declaration is here
var area: String {
^
<stdin>:12:11: error: inheritance from a final class 'Circle'
class Rectangle: Circle {
^
<stdin>:25:14: error: var overrides a 'final' var
override var radius: Double {
^
<stdin>:6:14: note: overridden declaration is here
final var radius = 12.5

เนื่องจากซูเปอร์คลาสถูกประกาศเป็น 'ขั้นสุดท้าย' และประเภทข้อมูลของมันจะถูกประกาศเป็น 'ขั้นสุดท้าย' ด้วยโปรแกรมจะไม่อนุญาตให้สร้างคลาสย่อยเพิ่มเติมและจะทำให้เกิดข้อผิดพลาด