在Swift中实现继承

定义基类

  • 任何不从另一个类继承的类都是所谓的基类
  • 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 类不会从一个通用基类继承。你没有指定特定父类的类都会...
    孤雁_南飞阅读 3,680评论 0 0
  • 继承 苹果官方文档 原帖地址 一个类可以从另一个类继承方法,属性和其他的特性。当一个类从另一个类继承的时候,继承类...
    hrscy阅读 2,490评论 1 2
  • 一个类可以从另一个类继承方法、属性和其他的特性。当一个类从另一个类继承的时候,继承的类就是所谓的子类,而这个类继承...
    hello_bear阅读 4,505评论 0 1
  • 1.基类 定义一个基类 任何不从另一个类继承的类都是所谓的基类。(Swift 类不会从一个通用基类继承。你没有指定...
    苹果上的小豌豆阅读 5,879评论 0 1
  •  一个类可以继承另外一个类的方法、属性和其他特性。当一个类继承其他类时,继承类叫子类,被继承类叫父类。 在swif...
    EndEvent阅读 4,377评论 3 3