Swift_继承

本文介绍Swift中的继承和重写概念,包括父类与子类的定义、属性重写及方法重写等,并展示了如何使用Swift语法实现这些功能。

/**

 *  继承

 */

//父类(超类)

class Vehicle {

    var currentSpeed = 0.0

    var description:String {

        return "traveling at \(currentSpeed) miles per hour"

    }

    func makeNoise() {

        //什么不做

    }

}


let someVehicle = Vehicle()

print(someVehicle.description)

//子类


class Bicycle: Vehicle {

    var hasBasket = false

}


let bicycle = Bicycle()

bicycle.hasBasket = true


print(bicycle.hasBasket)


bicycle.currentSpeed = 1.5

print(bicycle.description)



class Tandem: Bicycle {

    var currentNumberOfPassengers = 0

}


let tandem = Tandem()

tandem.hasBasket = true

tandem.currentNumberOfPassengers = 2

tandem.currentSpeed = 22.0

print("Tandem: \(tandem.description)")


//重写(Overriding)


class Train: Vehicle {

    override func makeNoise() {

        print("___Choo Choo")

    }

}


let train = Train()

train.makeNoise()


//重写属性

/*

 重写属性的GettersSetters

 你可以提供定制的 getter( setter)来重写任意继承来的属性,无论继承来的属性是存储型的还是计算型的 属性。子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性会有一个名字和类型。你在 重写一个属性时,必需将它的名字和类型都写出来。这样才能使编译器去检查你重写的属性是与超类中同名同类 型的属性相匹配的。

 你可以将一个继承来的只读属性重写为一个读写属性,只需要你在重写版本的属性里提供 getter setter 可。但是,你不可以将一个继承来的读写属性重写为一个只读属性。

 */

/*

 注意:

 如果你在重写属性中提供了 setter,那么你也一定要提供 getter

 如果你不想在重写版本中的 getter 里修改 继承来的属性值,你可以直接通过 super.someProperty 

 来返回继承来的值,其中 someProperty 是你要重写的属性的名字。

 */

class Car: Vehicle {

    var gear = 1

    override var description: String {

        return super.description + " in gear \(gear)"

    }

    

}


let car = Car()

print(car.description)

car.currentSpeed = 25

car.gear = 3

print("Car: \(car.description)")

//重写属性观察器(Property Observer)

/*

 注意: 你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。

 这些属性的值是不可以被设置 ,所以,为它们提供 willSet didSet 实现是不恰当。

 此外还要注意,你不可以同时提供重写的 setter 重写的属性观察器。如果你想观察属性值的变化,

 并且你已经为那个属性提供了定制的 setter,那么你在 sett er 中就可以观察到任何值变化了。

 */


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)")


//防止重写

/*

 你可以通过把方法,属性或下标脚本标记为 final 来防止它们被重写,只需要在声明关键字前加上 final 特性即

 可。(例如: final var , final func , final class func , 以及 final subscript )

 如果你重写了 final 方法,属性或下标脚本,在编译时会报错。在类扩展中的方法,属性或下标脚本也可以在扩

 展的定义里标记为 final

 你可以通过在关键字 class 前添加 final 特性( final class )来将整个类标记为 final ,这样的类是不可被 继承的,任何子类试图继承此类时,在编译时会报错

 */

Swift 不支持多继承,即一个类不能直接从多个父类继承特性[^1]。然而,Swift 提供了多种机制来实现类似多继承的功能,主要包括协议(Protocols)、扩展(Extensions)、组合(Composition)以及类型擦除(Type Erasure)。 ### 协议(Protocols) Swift 中的协议类似于其他语言中的接口,它定义了一组方法、属性或其他要求,任何类型(类、结构体、枚举)都可以遵循这些要求。通过协议,可以实现多个类型共享相同的行为,从而模拟多继承的效果。 ```swift protocol Flyable { func fly() } protocol Swimmable { func swim() } class Bird: Flyable { func fly() { print("Bird is flying.") } } class Duck: Bird, Swimmable { func swim() { print("Duck is swimming.") } } let duck = Duck() duck.fly() // Inherited method from Bird duck.swim() // Method from Swimmable protocol ``` ### 扩展(Extensions) Swift 中的扩展允许为已有的类型添加新的功能,包括方法、计算属性、下标、初始化器等。通过扩展,可以在不修改原始类型的情况下为其添加新的行为,这在某些情况下可以替代多继承。 ```swift extension Flyable where Self: Bird { func glide() { print("Bird is gliding.") } } let bird = Bird() bird.glide() // Method added via extension ``` ### 组合(Composition) 组合是一种设计模式,它通过将多个对象组合在一起,来实现多个功能的复用。相比于继承,组合提供了更高的灵活性和可维护性。在 Swift 中,可以通过组合多个对象来实现类似多继承的效果。 ```swift class Engine { func start() { print("Engine started.") } } class Wheels { func rotate() { print("Wheels rotating.") } } class Car { let engine = Engine() let wheels = Wheels() func start() { engine.start() } func drive() { wheels.rotate() } } let car = Car() car.start() // Starts the engine car.drive() // Rotates the wheels ``` ### 类型擦除(Type Erasure) 类型擦除是一种处理协议类型的技术,它允许将具体的类型信息隐藏起来,只暴露协议定义的行为。通过类型擦除,可以实现更灵活的多态性,从而在一定程度上模拟多继承的效果。 ```swift class AnyFlyable { private let _fly: () -> Void init<T: Flyable>(_ flyable: T) { _fly = flyable.fly } func fly() { _fly() } } class PaperAirplane: Flyable { func fly() { print("Paper airplane is flying.") } } let paperAirplane = PaperAirplane() let anyFlyable = AnyFlyable(paperAirplane) anyFlyable.fly() // Flies through type erasure ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值