• 十二、继承 Inheritance


    1. 概述

    子类可以访问父类的方法,属性和下标脚本。并且可以覆盖父类的版本,实现自己的版本。

    同样, 也可以在子类中给父类的属性(stored or computed)提供属性监视器。

    2. 定义一个基类 Defining a Base Class

    不是从任何类继承而来的来,称为基类。

    如下,定义一个汽车的基类:

        class Vehicle {
          var currentSpeed = 0.0
          var description: String {//只读属性
            return "traveling at (currentSpeed) miles per hour"
          }
          func makeNoise() {
            // do nothing - an arbitrary vehicle doesn't necessarily make a noise
          }
        }

    3. 子类 Subclassing

    定义一个自行车类

        class Bicycle: Vehicle {
            var hasBasket = false
        }

    4. 重载(覆盖) Overriding

    使用override关键字在子类中覆盖父类的版本

    5. 访问父类的方法、属性和下标脚本 Accessing Superclass Methods, Properties, and Subscripts

    子类定义了自己的版本,覆盖父类的版本时,有时需要访问父类的版本,此时使用super关键字访问父类版本,如:

    super.someMethod()

    super.someProperty

    super[someIndex]

    6. 覆盖方法 Overriding Methods

    如,定义火车类:

        class Train: Vehicle {
          override func makeNoise() {
            println("Choo Choo")
          }
        }
        let train = Train()
        train.makeNoise() // prints "Choo Choo"

    7. 覆盖属性 Overriding Properties

    7.1 覆盖get方法和set方法 Overriding Property Getters and Setters

    你可以在子类中给父类的任何属性提供get方法和set方法。

    在父类中为 read-only 属性,在子类中你可以给它同时提供 get 和 set 方法,使它在子类中为 read-write 属性。

    反之不行,你不能将父类中 read-write 属性,在子类中覆盖为 read-only 。

    如,car 类:

        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
        println("Car: (car.description)")
        // Car: traveling at 25.0 miles per hour in gear 3

    7.2 覆盖属性监视器 Overriding Property Observers

    你可以给任何继承来的属性添加属性监视器,除开以下情况:

    1)你不能在子类中给 inherited constant stored properties 和 inherited read-only computed properties 添加属性监视器,因为他们不可改变。

    2)你不能在子类中同时提供覆盖的set 方法和覆盖的属性监视器,因为你可以在set方法中对属性值的变化作出反应。

        class AutomaticCar: Car {
          override var currentSpeed: Double {
            didSet {
              gear = Int(currentSpeed / 10.0) + 1
            }
          }
        }
        let automatic = AutomaticCar()
        automatic.currentSpeed = 35.0
        println("AutomaticCar: (automatic.description)") // AutomaticCar: traveling at 35.0 miles per hour in gear 4

    8. 阻止覆盖Preventing Overrides

    你可以通过final关键字让某个类中属性、方法和小标脚本无法被子类覆盖,如

    final var

    final func

    final class func

    final subscript

    final class //这个类不能被任何类继承

    参考:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-ID193

  • 相关阅读:
    header头参数 确定该文件类型
    phpexcel 使用说明
    杂七杂八 各种小知识
    php 后知后觉
    限制SSH登录失败次数
    DES和AES密码之间的区别 & 对称加密算法DES、3DES和AES 原理总结
    加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用
    加密算法学习总结---DES-CBC加密算法 & 分组加密的四种模式
    Linux下进程间通信方式——共享内存
    fork()+pipe() --> 父子进程间通过管道通信 Linux系统编程pipe()
  • 原文地址:https://www.cnblogs.com/actionke/p/4233245.html
Copyright © 2020-2023  润新知