zoukankan      html  css  js  c++  java
  • swift-重写方法和属性、禁止重写

    /*子类可以为继承来的实例方法,类方法,实例属性,或下标提供自己定制的实现。我们把这种行为叫重写。
    如果要重写某个特性,你需要在重写定义的前面加上   关键字。这么做,你就表明了你是想提供一个重写 版本,而非错误地提供了一个相同的定义。意外的重写行为可能会导致不可预知的错误,任何缺少   关键 字的重写都会在编译时被诊断为错误。
    关键字会提醒 Swift 编译器去检查该类的超类(或其中一个父类)是否有匹配重写版本的声明。这个 检查可以确保你的重写定义是正确的。
    */
    
    
         class Vehicle {
        var currentSpeed = 0.0
        var description: String {
            return "traveling at (currentSpeed) miles per hour"
        }
        func makeNoise() {
            // 什么也不做
        } }
    
    //重写方法
    /*在子类中,你可以重写继承来的实例方法或类方法,提供一个定制或替代的方法实现。*/
    class Bicycle: Vehicle {
    
        override func makeNoise() {
            print("Choo Choo")
        }
    
    }
    //重写属性
    /*你可以重写继承来的实例属性或类型属性,提供自己定制的 getter 和 setter,或添加属性观察器使重写的属性 可以观察属性值什么时候发生改变。*/
    class Car: Vehicle {
        var gear = 1
        override var description: String {
            return super.description + " in gear (gear)"
        } }
    
    //重写属性观察器
    /*你可以通过重写属性为一个继承来的属性添加属性观察器。这样一来,当继承来的属性值发生改变时,你就会被 通知到,无论那个属性原本是如何实现的*/
    class AutomaticCar: Car {
        override var currentSpeed: Double {
            
            didSet {
                gear = Int(currentSpeed / 10.0) + 1
            }
        }
    }
    class First_Demo1: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let  bicycle = Bicycle()
            print(bicycle.makeNoise())
            // 打印 "Choo Choo"
            
            let car = Car()
            car.currentSpeed = 25.0
            car.gear = 3
            print("Car: (car.description)")
            // 打印 "Car: traveling at 25.0 miles per hour in gear 3"
            
            let automatic = AutomaticCar()
            automatic.currentSpeed = 35.0
            print("AutomaticCar: (automatic.description)")
            // 打印 "AutomaticCar: traveling at 35.0 miles per hour in gear 4"
    
            
           //防止重写
    /*
    1、你可以通过把方法,属性或下标标记为 final  来防止它们被重写,只需要在声明关键字前加上 final  修饰符即 可(例如:final var ,final func ,final class func ,以及final subscript )。
    2、如果你重写了带有  final 标记的方法,属性或下标,在编译时会报错。在类扩展中的方法,属性或下标也可以在 扩展的定义里标记为 final 的。
    3、你可以通过在关键字 class  前添加 final  修饰符( final class  )来将整个类标记为 final 的。这样的类是不可 被继承的,试图继承这样的类会导致编译报错*/
        }
    
     
  • 相关阅读:
    解决iex -S mix报错
    OTP服务器
    多进程
    字符串与二进制
    IphoneX适配正确姿势
    Babel 配置用法解析
    babel版本变化
    你好,babel
    XSS攻击 && CSRF攻击 基础理解
    小程序开发初体验~
  • 原文地址:https://www.cnblogs.com/sayimba/p/6229850.html
Copyright © 2011-2022 走看看