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