Swift 中类的继承

1、定义基类

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

2、子类

  • 子类是基于现有类创建新类的行为。子类从现有的类继承了一些特征,你可以重新定义它们。你也可以为子类添加新的特征。
  • 为了表明子类有父类,要把子类写在父类的前面,用冒号分隔。
class Vehicle {  //此时 Vehicle 类不从任何类继承,它是一个基类
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        print("呜呜呜呜呜...")
    }
}
class Bicycle: Vehicle {  // Bicycle 类从 Vehicle 类继承
    var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0   //直接调用父类属性 setter 方法为属性赋值
print("bicycle: \(bicycle.description)")

3、重写

  • 子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。这就所谓的重写。
  • 要重写而不是继承一个特征,你需要在你的重写定义前面加上 override 关键字。这样做说明提供了一个重写而不是意外提供了一个相同定义。意外的重写可能导致意想不到的行 为,并且任何没有使用 override 关键字的重写都会在编译时被诊断为错误。
  • 使用 super 前缀访问父类的方法、属性和下标脚本
//重写方法
class Train: Vehicle {
    override func makeNoise() {  //重写父类的方法
        print("呼呜, 呼呜...")
        super.currentSpeed = 180.0  //使用 super 关键字来访问 父类的属性
        print(super.description)
    }
}
let train = Train()
train.makeNoise()
1> 重写属性的 getter 和 setter
  • 可以提供一个自定义的 getter (和 setter,如果合适的话)来重写任意继承的属性,无论在最开始继承的属性实现为储属性还是计算属性。
class Car: Vehicle {
    var gear = 1
    override var description: String {  //重写了计算属性的 getter 方法
        return super.description + "in gear \(gear)"
    }
}
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
2> 重写属性的观察器
  • 使用属性重写来为继承的属性添加属性观察器。就可以在继承属性的值改变时得到通知。无论这个属性最初如何实现。
  • 不能给继承而来的常量存储属性和只读的计算属性添加属性观察器。
  • 不能为同一个属性同时提供重写的 setter 和重写的属性观察器
//重写属性的观察器
class AutomiticCar: Car {
    override var currentSpeed: Double { //重写父类的存储属性
        didSet {  //重写父类存储属性的观察器
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}
let automiticCar = AutomiticCar()
automiticCar.currentSpeed = 35.0
print("automitic: \(automiticCar.description)")
3> 阻止重写
  • 通过标记为 final 来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下 标脚本的关键字前写 final 修饰符(比如 final var , final func , final class func , final subscript )
class Vehicle {  //此时 Vehicle 类不从任何类继承,它是一个基类
    var currentSpeed = 0.0
    final var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        print("呜呜呜呜呜...")
    }
}
class Car: Vehicle {
//    override var description: String {
//        return ""  //此时报错,显示这个属性已经被 final 修饰了,不能被重写了
//    }
    override func makeNoise() {
        print("啦啦啦啦啦...")
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值