Latest web development tutorials

มรดกสวิฟท์

มรดกสามารถเข้าใจได้เป็นระดับที่เราได้รับวิธีการและคุณสมบัติของชั้นอื่นใช้

เมื่อชั้นเรียนสืบทอดมาจากชั้นอื่นที่เรียนมาจะเรียกว่าเป็น subclass ชั้นที่สืบทอดมาเรียก superclass (หรือผู้ปกครอง)

สวิฟท์ในชั้นเรียนสามารถเรียกและการเข้าถึงวิธี superclass ของคุณสมบัติและสคริปต์ห้อยและสามารถแทนที่พวกเขา

นอกจากนี้เรายังสามารถเพิ่มคุณสมบัติสังเกตการณ์คุณสมบัติที่สืบทอดมาเรียน


ชั้นฐาน

ไม่มีชั้นเรียนอื่น ๆ รับช่วงชั้นโทรชั้นฐาน (base class)

ตัวอย่างต่อไปนี้เรากำหนด StudDetails ชั้นฐานอธิบายนักเรียน (stname) และทุกวิชาคะแนน (mark1, Mark2, mark3):

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"
let mark1 = 98
let mark2 = 89
let mark3 = 76

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

เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

swift
98
89
76
swift
98
89
76

ประเภทรอง

หมายถึงประเภทรองคือการสร้างคลาสใหม่บนพื้นฐานของ class ที่มีอยู่

เพื่อระบุ superclass ของชั้นที่ชื่อชั้นซุปเปอร์เขียนที่ด้านหลังของชื่อประเภทรอง (:) ลำไส้ใหญ่แยกไวยากรณ์เป็นดังนี้

class SomeClass: SomeSuperclass {
    // 类的定义
}

ตัวอย่าง

ตัวอย่างต่อไปนี้เรากำหนด StudDetails superclass แล้วซับคลาสทอมมรดก:

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

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

let tom = Tom()
tom.show()

เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

Mark1:93, Mark2:89

Rewrite (แทนที่)

subclass สามารถสืบทอดวิธีเช่นวิธีการเรียนอินสแตนซ์ทรัพย์สินหรือสคริปต์ห้อยที่จะตระหนักถึงความสามารถในการปรับแต่งของพวกเขาที่เราเรียกพฤติกรรมนี้เขียนใหม่ (ที่สำคัญ)

เราสามารถใช้คำแทนที่เพื่อให้บรรลุเขียน

การเข้าถึงวิธี superclass คุณสมบัติและสคริปต์ห้อย

วิธีการที่คุณสามารถใช้เพื่อเข้าถึงคำนำหน้าชั้นซุปเปอร์ซุปเปอร์ทรัพย์สินหรือสคริปต์ห้อย

เขียนใหม่ วิธีการเข้าถึงคุณสมบัติสคริปต์ห้อย
ทาง super.somemethod ()
คุณสมบัติ super.someProperty ()
สคริปต์ห้อย ซุปเปอร์ [someIndex]

วิธีการเอาชนะและคุณสมบัติ

วิธีการเอาชนะ

ในชั้นย่อยของเราเราสามารถใช้คำแทนที่เพื่อแทนที่วิธี superclass

ตัวอย่างต่อไปนี้เราเขียน Show () วิธีการ:

class SuperClass {
    func show() {
        print("这是超类 SuperClass")
    }
}

class SubClass: SuperClass  {
    override func show() {
        print("这是子类 SubClass")
    }
}

let superClass = SuperClass()
superClass.show()

let subClass = SubClass()
subClass.show()

เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

这是超类 SuperClass
这是子类 SubClass

คุณสมบัติที่สำคัญ

คุณสามารถให้ความทะเยอทะยานที่กำหนดเอง (หรือ Setter) เขียนคุณสมบัติได้รับมรดกใด ๆ ไม่ว่าจะเป็นทรัพย์สินที่ได้รับมรดกเป็นชนิดหรือประเภทการจัดเก็บข้อมูลการประมวลผลของทรัพย์สิน

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

ข้อควรระวัง:

  • ถ้าคุณให้ Setter ในการเขียนคุณสมบัติแล้วคุณจะต้องให้ความทะเยอทะยาน

  • หากคุณไม่ต้องการที่ทะเยอทะยานเขียนรุ่นในการปรับเปลี่ยนค่าทรัพย์สินมรดกคุณสามารถกลับไปค่าที่สืบเชื้อสายมาจาก super.someProperty ที่ someProperty เป็นชื่อที่คุณต้องการแทนที่ทรัพย์สิน

ตัวอย่างต่อไปนี้เรากำหนด subclass ของ superclass วงกลมและสี่เหลี่ยมเราเขียนบริเวณโรงแรมชั้นสี่เหลี่ยมผืนผ้า:

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半径 \(radius) "
    }
}

// 继承超类 Circle
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}

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

เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:

Radius 矩形半径 25.0  ,但现在被重写为 3

เอาชนะคุณสมบัติ Viewer

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

หมายเหตุ: คุณไม่สามารถเพิ่มคุณสมบัติสังเกตการณ์สำหรับแอตทริบิวต์ประเภทคงที่ได้รับมรดกหรือหน่วยความจำอ่านอย่างเดียวคุณสมบัติที่สืบทอดมาคำนวณ

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半径为 \(radius) "
    }
}

class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}


let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半径: \(rect.area)")

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


let sq = Square()
sq.radius = 100.0
print("半径: \(sq.area)")
半径: 矩形半径为 25.0  ,但现在被重写为 3
半径: 矩形半径为 100.0  ,但现在被重写为 21

ป้องกันการเขียน

เราสามารถใช้คำสุดท้ายป้องกันพวกเขาจากการถูกเขียนทับ

หากคุณแทนที่วิธีสุดท้ายทรัพย์สินหรือสคริปต์ห้อยที่ข้อผิดพลาดเวลารวบรวม

คุณสามารถเพิ่มรอบสุดท้ายก่อนที่ชั้นคำหลักลักษณะ (ชั้นสุดท้าย) ไปทั้งชั้นสุดท้ายจะถูกทำเครื่องหมายเพื่อให้ชั้นเรียนไม่สามารถสืบทอดมิฉะนั้นข้อผิดพลาดสะสมจะมีการรายงาน

final class Circle {
    final var radius = 12.5
    var area: String {
        return "矩形半径为 \(radius) "
    }
}
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半径: \(rect.area)")

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

let sq = Square()
sq.radius = 100.0
print("半径: \(sq.area)")

เนื่องจากตัวอย่างข้างต้นใช้คำสำคัญสุดท้ายคือการไม่ได้รับอนุญาตที่จะเขียนเพื่อให้การดำเนินการจะได้รับ:

error: var overrides a 'final' var
    override var area: String {
                 ^
note: overridden declaration is here
    var area: String {
        ^
error: var overrides a 'final' var
    override var radius: Double {
                 ^
note: overridden declaration is here
    final var radius = 12.5
              ^
error: inheritance from a final class 'Circle'
class Rectangle: Circle {
      ^