swift之类的继承

swift之类的继承

知识点:

1、类的继承、重写等概念;

2、子类和父类的属性和方法关系;


继承(Inheritance)

综述:一个类可以继承(inherit)另一个类的方法(methods),属性(properties)和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。


首先定义一个基类

下面的例子定义了一个叫Vehicle的基类。这个基类声明了一个名为currentSpeed,默认值是0.0的存储属性(属性类型推断为Double)。currentSpeed属性的值被一个String 类型的只读计算型属性description使用,用来创建车辆的描述。

Vehicle基类也定义了一个名为makeNoise的方法。这个方法实际上不为Vehicle实例做任何事,但之后将会被Vehicle的子类定制:

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // 什么也不做
    }
}

您可以用初始化语法创建一个Vehicle的新实例,即类名后面跟一个空括号:

let someVehicle = Vehicle()

现在已经创建了一个Vehicle的新实例,你可以访问它的description属性来打印车辆的当前速度。

print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour

创建子类并继承父类

继承的格式:为了指明某个类的超类,将超类名写在子类名的后面,用冒号分隔:子类会自动获得父类的所有属性和方法,还可以添加属性和方法。

class SomeClass: SomeSuperclass {
    // 类的定义
}

这里定义一个叫Bicycle的子类,继承成父类Vehicle

class Bicycle: Vehicle {
    var hasBasket = false //新添加一个属性,推断为boolean类型
}

使用:

let bicycle = Bicycle()
bicycle.hasBasket = true 
bicycle.currentSpeed = 15.0 //修改父类属性值
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour

重写(Overriding)

重写方法:

下面的例子定义了Vehicle的一个新的子类,叫Train,它重写了从Vehicle类继承来的makeNoise方法:

class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}

重写属性:

class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}

重写的description属性,首先要调用super.description,然后在后面添加自己需要的信息。

class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {//didSet在新的值被设置之后立即调用,willSet在新的值被设置之前调用
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

运行结果:

let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4


防止重写

只要在属性和方法中,在方法和属性前面用final修饰词(例如:final var, final func, final class func, 以及 final subscript)。

如果你重写了final方法,属性或下标脚本,在编译时会报错。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值