import UIKit
class Person {
// 给方法添加class关键字
class func work() {
print("Type Method: Person: 警察.")
}
// 使用static关键字创建类方法
static func nameOfPerson(name: String) {
print("Type Method: Person name: \(name)")
}
// 可以和类方法重名, 以及一样的参数.
func nameOfPerson(name: String) {
print("Instance Method: person name \(name)")
}
}
class Teacher: Person {
// 重写父类的类型方法.
override class func work() {
print("Type Method: Teacher: University Teacher")
}
/**
* 下面的写法是错误的, 报错信息: Class method overrides a 'final' class method(重写了一个final的类方法.)
* final 关键字:
可以通过把方法,属性或下标标记为final来防止它们被重写,只需要在声明关键字前加上final修饰符即可(例如:final var,final func,final class func,以及final subscript)。如果你重写了final方法,属性或下标,在编译时会报错。
*/
// override static func nameOfPerson(name: String) {
//
// }
}
class Student: Person {
// 子类Student的实例方法work(), 和父类的类方法work()没有关系, 二者不在同一个级别上, 不存在同名问题.
func work() {
print("Instance Method: Student: University Student")
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let per = Person()
// 父类的类方法
Person.work() /**< Type Method: Person: 警察. */
Person.nameOfPerson("Tom") /**< Type Method: Person name: Tom */
// 父类的实例方法
per.nameOfPerson("Edward") /**< Instance Method: person name Edward. */
// 子类的类方法
// 直接调用父类的类方法
Teacher.nameOfPerson("Susan") /**< Type Method: Person name: Susan */
// 调用的是子类中重写父类的类方法work()
Teacher.work() /**< Type Method: Teacher: University Teacher */
let stu = Student()
// 子类Student的实例方法work()
stu.work() /**< Instance Method: Student: University Student */
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
关键字static和class的区别
在方法的func关键字之前加上关键字static或者class都可以用于指定类方法.
不同的是用class关键字指定的类方法可以被子类重写, 如下:
override class func work() {
print("Teacher: University Teacher")
}
但是用static关键字指定的类方法是不能被子类重写的, 根据报错信息: Class method overrides a 'final' class method.
我们可以知道被static指定的类方法包含final关键字的特性--防止被重写.