final 关键字
可以在定义类和类的成时使用 final 关键字 它的含义分别如下
- 1、在关键字class 前添加 final (修饰符) 可以将整个类标为 final ,这个样的类不可以被继承,视图继承这样的类会编译报错
final class Person {
}
class Stu : Person { //编译报错 error: inheritance from a final class 'Person'
}
- 2.在类的定义中将方法、属性、下标脚本标记为 final 可以防止它们被重写。只需要在声明关键字前加上 final 修饰即可
class Person {
final var name : String?
final func play() {
print("------")
}
final class var age : Int {
return 18
}
final class func run() {
print("******")
}
}
class tech : Person {
override var name : String? //error: expected declaration
override func play() {
//error: instance method overrides a 'final' instance method
}
override class var age : Int {
//error: class var overrides a 'final' class var
return 20
}
override class func run() {
//error: class method overrides a 'final' class method
}
}
super 关键字
当子类中重写父类中的方法,属性或者下标脚本,有时在重写版本中使用已经存在的父类实现会大有益处,比如,可以完善已经实现的行为,或者在一个继承来的变量中存储一个修改过的值,访问父类的成员使用的是 super 前缀,
super 的用处
1、访问父类的属性,在属性的getter和setter的重写中实现,可以通过 super.someProperty 来访问父类版本的
someProperty2、访问父类的方法,在方法 someMethod()的重写实现中 可以通过 super.someMethod()来调用父类版本的someMethod()
3、访问父类的下标脚本,在下标脚本的重写实现中,可以通过 super[someIndex] 来访问父类版本中的相同下标脚本
class Animal {
var age = 10
// 使用Static 修饰的静态属性不能被子类重写
static var weight : Double = 20
static func play() {
print("玩")
}
class var height : Double {
return 30
}
func run() {
print("动物在跑")
}
class func eat() {
print("动物在吃")
}
}
class Dog : Animal {
/*
override static var weight : Double {
get{
return 80
}
set{
}
}
*/
//error: cannot override static method
/*
override static func play() {
}
*/
//error: cannot override static method
override var age: Int {
get {
return super.age + 10
}
set {
super.age = newValue - 5
}
}
override class var height : Double {
get {
return super.height + 30
}
set {
}
}
override func run() {
super.run()
print("狗在跑")
}
override class func eat() {
super.eat()
print("狗在吃")
}
}
Dog.eat()
Dog.height
let dog = Dog()
dog.run()
dog.age