11-继承

2023-04-09  本文已影响0人  二斤寂寞

继承 (Inheritance)

image.png

内存结构

class Animal {
    var age = 0
}

class Dog : Animal {
    var weight = 0
}

class ErHa : Dog {
    var iq = 0                                                          
}
let a = Animal()
a.age = 10
// 32
print(Mems.size(ofRef: a))
/*
 0x00000001000073e0   指向类型信息地址
 0x0000000000000002   引用计数相关
 0x000000000000000a   age 
 0x0000000000000000   内存对齐,暂时没用到的
 */                                                           
print(Mems.memStr(ofRef: a))
let d = Dog()
d.age = 10
d.weight = 20
// 32
print(Mems.size(ofRef: d))
/*
 0x0000000100007490  指向类型信息地址
 0x0000000000000002  引用计数相关
 0x000000000000000a  age 
 0x0000000000000014  weight
 */                                                             
print(Mems.memStr(ofRef: d))
let e = ErHa()
e.age = 10
e.weight = 20
e.iq = 30                                                         
// 48                                                       
print(Mems.size(ofRef: e))
/*
 0x0000000100007560  指向类型信息地址
 0x0000000000000002  引用计数相关
 0x000000000000000a  age 
 0x0000000000000014  weight
 0x000000000000001e  iq
 0x0000000000000000  内存对齐,暂时没用到的
 */                                                          
print(Mems.memStr(ofRef: e))

重写实力方法、下标

class Animal {
    func speak() {
        print("Animal speak")
    }
    subscript(index: Int) -> Int {
        return index                                                                
    }
}

var anim: Animal
anim = Animal()
// Animal speak
anim.speak()                                                         
// 6
print(anim[6])
class Cat : Animal {
    override func speak() {
        super.speak()
        print("Cat speak")
    }
    override subscript(index: Int) -> Int {
        return super[index] + 1                                                          
    }
}

anim = Cat()
// Animal speak
// Cat speak
anim.speak()
// 7
print(anim[6])

重写实力方法、下标

class Animal {
    class func speak() {
        print("Animal speak")
    }
    class subscript(index: Int) -> Int {
        return index                                            
    }
}

// Animal speak
Animal.speak()
// 6
print(Animal[6])
class Cat : Animal {
    override class func speak() {
        super.speak()
        print("Cat speak")
    }
    override class subscript(index: Int) -> Int {
        return super[index] + 1                                                               
    }
}
// Animal speak
// Cat speak
Cat.speak()
// 7
print(Cat[6])

重写属性

重写实例属性

class Circle {
    var radius: Int = 0
    var diameter: Int {
        set {
            print("Circle setDiameter")
            radius = newValue / 2                                                  
        }
        get {
            print("Circle getDiameter")
            return radius * 2
        }                                                       
    }
}
var circle: Circle
circle = Circle()
circle.radius = 6
// Circle getDiameter
// 12
print(circle.diameter)

// Circle setDiameter
circle.diameter = 20

// 10
print(circle.radius)

重写实例属性

class SubCircle : Circle {
    override var radius: Int {                                                        
        set {
            print("SubCircle setRadius")
            super.radius = newValue > 0 ? newValue : 0          
        }
        get {                                                                
            print("SubCircle getRadius")
            return super.radius
        }
    }
    override var diameter: Int {                                                           
        set {
            print("SubCircle setDiameter")
            super.diameter = newValue > 0 ? newValue : 0        
        }
        get {                                                   
            print("SubCircle getDiameter")
            return super.diameter
        }                                                       
    }
}
var circle = SubCircle()
// SubCircle setRadius
circle.radius = 6

// SubCircle getDiameter
// Circle getDiameter
// SubCircle getRadius
// 12
print(circle.diameter)

// SubCircle setDiameter
// Circle setDiameter
// SubCircle setRadius
circle.diameter = 20

// SubCircle getRadius
// 10
print(circle.radius)

重写类型属性

class Circle {
    static var radius: Int = 0
    class var diameter: Int {
        set {
            print("Circle setDiameter")
            radius = newValue / 2                                                        
        }
        get {
            print("Circle getDiameter")
            return radius * 2
        }                                                       
    }
}
Circle.radius = 6
// Circle getDiameter
// 12
print(Circle.diameter)
// Circle setDiameter
Circle.diameter = 20
// 10
print(Circle.radius)
class SubCircle : Circle {
    override static var diameter: Int {
        set {
            print("SubCircle setDiameter")
            super.diameter = newValue > 0 ? newValue : 0        
        }
        get {
            print("SubCircle getDiameter")
            return super.diameter
        }                                                       
    }
}
SubCircle.radius = 6
// SubCircle getDiameter
// Circle getDiameter
// 12
print(SubCircle.diameter)
// SubCircle setDiameter
// Circle setDiameter
SubCircle.diameter = 20
// 10
print(SubCircle.radius)

属性观察器

class Circle {
    var radius: Int = 1
}

class SubCircle : Circle {
    override var radius: Int {
        willSet {                                                         
            print("SubCircle willSetRadius", newValue)
        }                                                       
        didSet {
            print("SubCircle didSetRadius", oldValue, radius)                                                                
        }
    }                                                           
}

var circle = SubCircle()

// SubCircle willSetRadius 10
// SubCircle didSetRadius 1 10
circle.radius = 10

属性观察器

class Circle {
    var radius: Int = 1 {                                       
        willSet {
             print("Circle willSetRadius", newValue)                                          
        } 
        didSet {                                              
            print("Circle didSetRadius", oldValue, radius) 
        }                                          
    } 
} 

class SubCircle : Circle {
    override var radius: Int {                                       
        willSet {
             print("SubCircle willSetRadius", newValue)                                                  
        }
        didSet {                                          
            print("SubCircle didSetRadius", oldValue, radius) 
        }                                      
    } 
} 

var circle = SubCircle()

// SubCircle willSetRadius 10
// Circle willSetRadius 10 
// Circle didSetRadius 1 10 
// SubCircle didSetRadius 1 10
circle.radius = 10

属性观察器

class Circle {
    var radius: Int {                                                           
        set {
            print("Circle setRadius", newValue)                 
        }
        get {                                                   
            print("Circle getRadius")                           
            return 20
        }                                                       
    }
}

class SubCircle : Circle {
    override var radius: Int {                                  
        willSet {
            print("SubCircle willSetRadius", newValue)          
        }
        didSet {                                                
            print("SubCircle didSetRadius", oldValue, radius)
        }                                                       
    }
}

var circle = SubCircle()
// Circle getRadius
// SubCircle willSetRadius 10
// Circle setRadius 10
// Circle getRadius
// SubCircle didSetRadius 20 20
circle.radius = 10

属性观察器

class Circle {
    var radius: Int {                                                           
        set {
            print("Circle setRadius", newValue)                 
        }
        get {                                                   
            print("Circle getRadius")                           
            return 20
        }                                                       
    }
}

class SubCircle : Circle {
    override static var radius: Int {                                  
        willSet {
            print("SubCircle willSetRadius", newValue)          
        }
        didSet {                                                
            print("SubCircle didSetRadius", oldValue, radius)
        }                                                       
    }
}

var circle = SubCircle()
// Circle getRadius
// SubCircle willSetRadius 10
// Circle setRadius 10
// Circle getRadius
// SubCircle didSetRadius 20 20
circle.radius = 10

final

多态:

在 Swift 中实现多态的方式主要有两种,分别是继承和协议。

1. 继承

继承是面向对象编程中最基本的多态实现方式。在 Swift 中,我们可以使用继承实现多态。 假设有一个基类 Animal,有两个子类 CatDog,它们都重写了 Animal 的方法 makeSound()。我们可以通过创建一个 Animal 类型的变量,然后将它指向 CatDog 的实例对象,从而实现多态。

class Animal {
    func makeSound() {
        print("Animal makes sound")
    }
}

class Cat: Animal {
    override func makeSound() {
        print("Cat makes sound")
    }
}

class Dog: Animal {
    override func makeSound() {
        print("Dog makes sound")
    }
}

let animal: Animal = Cat()
animal.makeSound()  // 输出 "Cat makes sound"let animal2: Animal = Dog()
animal2.makeSound() // 输出 "Dog makes sound"

在上面的代码中,我们首先定义了一个基类 Animal,然后创建了两个子类 CatDog。子类重写了 Animal 的方法 makeSound(),实现自己的行为。然后我们创建了 Animal 类型的变量 animalanimal2,分别指向 CatDog 类型的实例对象。接着对 animalanimal2 调用 makeSound() 方法,分别输出了不同的结果。

2. 协议

协议是 Swift 中实现多态的另一种方式。在 Swift 中,协议可以定义一组行为特征,不同类型可以遵守同一个协议,从而实现相同的行为特性。 例如,我们可以定义一个名为 Animal 的协议,定义 makeSound() 方法。

protocol Animal {
  func makeSound()
}

class Cat: Animal {
  func makeSound() {
    print("Cat makes sound")
  }
}

class Dog: Animal {
  func makeSound() {
    print("Dog makes sound")
  }
}

let animal: Animal = Cat()
animal.makeSound() // 输出 "Cat makes sound"let animal2: Animal = Dog()
animal2.makeSound() // 输出 "Dog makes sound"

在上面的代码中,我们首先定义了一个 Animal 协议,并定义了 makeSound() 方法。然后我们创建了两个实现了 Animal 协议的类 CatDog。最后,我们创建了 Animal 类型的变量 animalanimal2,分别指向 CatDog 类型的实例对象,从而实现了多态。

查看汇编实现:

观察一下 class Animalstruct Animal 有啥不一样。

class Animal {
    func speak() {
        print("Animal speak")
    }

    func eat() {
        print("Animal eat")
    }

    func sleep() {
        print("Animal sleep")
    }
}

let animal: Animal = Cat()
animal.speak()
animal.eat()
animal.sleep()
上一篇 下一篇

猜你喜欢

热点阅读