๐Ÿ”ธSelf

โ•ฑ๐Ÿšง under construction

swift โŸฉ type โŸฉ inheritance โŸฉ Self

  • ๅœจ protocol ็š„ๅฎš็พฉไธญ๏ผšSelf ๆŒ‡้ตๅพช่ฉฒๅ”ๅฎš็š„ๅ…ท้ซ”ๅž‹ๅˆฅ (concrete type)ใ€‚

  • ๅœจ class ็š„ๅฎš็พฉไธญ๏ผšSelf ๆŒ‡่ฉฒ็‰ฉไปถ็š„ๅ…ท้ซ”ๅž‹ๅˆฅ๏ผŒไพ‹ๅฆ‚๏ผš็•ถไธ€ๅ€‹ๅฎš็พฉๅœจ class A ไธญ็š„ๆ–นๆณ•(method) ่ฃก้ขๅฆ‚ๆžœๆๅˆฐ Self๏ผŒ้‚ฃ้บผ้€™ๅ€‹ Self ไธไธ€ๅฎšๆŒ‡ A๏ผŒๅ› ็‚บๅฆ‚ๆžœไธ€ๅ€‹ๅญ้กžๅˆฅ (subclass) class B ็š„็‰ฉไปถ (้€้Ž็นผๆ‰ฟ็š„ๆ–นๅผ) ๅŸท่กŒ้€™ๅ€‹ๆ–นๆณ•ๆ™‚๏ผŒSelf ๆŒ‡็š„ๆ˜ฏ Bใ€‚

// superclass
class BasePoint {

    var x: Double
    var y: Double
    
    required init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }
    
    func duplicate() -> Self {
        // โญ๏ธ `Self` ๆŒ‡ใ€Œ็œŸๆญฃๅŸท่กŒๆญคๆ–นๆณ•็š„็‰ฉไปถใ€็š„ใ€Œๅž‹ๅˆฅใ€๏ผŒไพ‹ๅฆ‚๏ผš
        //  โ€ข basePoint.duplicate()   ๏ผšSelf ๆŒ‡ BasePoint
        //  โ€ข coloredPoint.duplicate()๏ผšSelf ๆŒ‡ ColoredPoint
        return Self(x: x, y: y)    // โญ๏ธ ๆณจๆ„๏ผš้€™่ฃก Self ๆ˜ฏๅคงๅฏซโ—๏ธ
    }
}

// subclass
class ColoredPoint: BasePoint {

    var color: String
    
    // (convenience init)
    required convenience init(x: Double, y: Double) {
        // โญ๏ธ ๆณจๆ„๏ผš้€™่ฃก self ๆ˜ฏๅฐๅฏซโ—๏ธ
        // (convenience init ๆŒ‡ๆดพๅˆๅง‹ๅŒ–ไปปๅ‹™็ตฆ่‡ชๅทฑ็š„ designated init)
        self.init(x: x, y: y, color: "black")
    }
    
    // (designated init)
    required init(x: Double, y: Double, color: String = "black") {
        self.color = color
        super.init(x: x, y: y)
    }
}

// BasePoint instaces
let a1 = BasePoint(x: 1, y: 2)
let a2 = a1.duplicate()

// ColoredPoint instances
let b1 = ColoredPoint(x: 3, y: 4, color: "red")
let b2 = b1.duplicate() // โญ๏ธ ๅŸท่กŒ็นผๆ‰ฟไพ†็š„ๆ–นๆณ•

print(type(of: a2))     // โญ๏ธ BasePoint
print(type(of: b2))     // โญ๏ธ ColoredPoint

Last updated

Was this helpful?