美文网首页
在Swift中实现继承

在Swift中实现继承

作者: 一个栗 | 来源:发表于2021-12-24 17:18 被阅读0次

定义基类

  • 任何不从另一个类继承的类都是所谓的基类
  • Swift 类不会从一个通用的基类继承。你没有指定特定父类的类都会以基类的形式创建。
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
    }
}

子类

  • 子类是基于现有类创建新类的行为。子类从现有的类继承了一些特征,你可以重新定义他们。你也可以为子类添加新的特征。
  • 为了表明子类有父类,要把子类写在父类的前面,用冒号分隔。
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        
    }
}

class Bicycle: Vehicle {
    var hasBasket = false
}

let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0
print("Bicycle:\(bicycle.description)")

执行结果如下:
Bicycle:traveling at 15.0 miles per hour

重写

  • 子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承,这就是所谓的重写。
  • 要重写而不是继承一个特征,你需要在你的重写定义前面加上 override 关键字。这样做说明你打算提供一个重写而不是意外提供了一个相同定义。意外的重写可能导致意想不到的行为,并且任何没有使用 override 关键字的重写都会在编译时被诊断为错误。

访问父类的方法、属性和下标脚本

  • 你可以通过使用 super 前缀访问父类的方法、属性或下标脚本

重写方法

  • 可以在子类中重写一个继承的实力或类型方法来提供定制的或替代的方法实现。
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        
    }
}

class Train: Vehicle {
    override func makeNoise() {
        print("呜呜~")
    }
}

let train = Train()
train.makeNoise()

重写属性的 getter 和 setter

  • 可以提供一个自定义的 getter (和 setter,如果合适的话)来重写任意继承的属性,无论在最开始继承的属性实现为储属性还是计算属性。
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        
    }
}

class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + "in gear \(gear)"
    }
}

let car = Car()
car.currentSpeed = 25.0;
car.gear = 3
print("Cat:\(car.description)")

执行结果如下:
Cat:traveling at 25.0 miles per hourin gear 3

重写属性的观察器

class AutomaticCar : Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar:\(automatic. description)")

执行结果如下:
AutomaticCar:traveling at 35.0 miles per hourin gear 4

防止重写

  • 可以通过标记为 final 来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下标脚本的关键字前写 final 修饰符(比如final var,final func,final class func , final subscript)

相关文章

  • 在Swift中实现继承

    定义基类 任何不从另一个类继承的类都是所谓的基类 Swift 类不会从一个通用的基类继承。你没有指定特定父类的类都...

  • Swift 中实现继承

    定义基类 任何不从另一个类继承的类都是所谓的基类 Swift 类不会从一个通用基类继承。你没有指定特定父类的类都会...

  • 类继承

    继承是面向对象的重要特征之一。swift中的继承只能发生在类上,结构体和枚举不能继承。在swift中,一个类继承另...

  • 运行时加载属性列表、Swift4中的 @objcMembers

    原因:@objcMembers 在Swift 4中继承 NSObject 的 swift class 不再默认全部...

  • 实现字典和模型的自动转换

    实现原理 通过获取类的属性,填充和读取数据 代码实现 注意事项 swift4.0中继承 NSObject 的 sw...

  • OC&Swift runtime 一 Classes

    在Swift 4中继承 NSObject 的 swift class 不再默认全部 bridge 到 OC,如果我...

  • 无标题文章

    Swift算法俱乐部:Swift 链表数据结构@(Swift)在本教程中,我们将会在Swift 3中实现链表。##...

  • Swift 遇到的坑

    在swift中字典转模型,创建的model 继承自 NSObject,如果是swift 3 ,则在模型中创建属性不...

  • Swift--AnyObject初步探索

    Swift 日常笔记碎片知识 在Swift中AnyObject对应OC中的id,用于保存对象类型,因此继承与NSO...

  • swift方法参数遵守多继承和遵守多个协议

    参数继承协议 OC中 id Swift 3 protocol Swift 4 A & B 文档

网友评论

      本文标题:在Swift中实现继承

      本文链接:https://www.haomeiwen.com/subject/ymribltx.html