import Foundation
/*
什么叫继承: 可以简单理解为一个类可以从它的父类或者基类中直接拿属性或者方法去使用
冒号":"表示两者之间的继承关系
*/
class Person
{
/*- 属性 -*/
var name: String = ""
// 储存属性如果没有在创建的时候赋值, 就要在每一个构造方法中(初始化的时候)赋值
var age: Int
// 构造方法:每个类都有一个默认的构造方法
// 一个对象创建完毕后, 都需要使用构造方法对其进行初始化, 也就是OC中的初始化方法
// 对比其他方法, 没有func关键字
// 没有返回值
init()
{
// print("这是一个人的构造方法")
// 注意, 在这个初始化方法中也要给age赋值
self.age = 0
}
// 自定义构造方法
init(name: String, age: Int)
{
self.name = name
self.age = age
}
/*- 方法 -*/
func sleep()
{
print("这个人在睡觉ingzzzzZZ...")
}
// 析构函数(相当于OC中的Dealloc), 用于释放对象资源
// deinit的调用是在一个消息处理结束之后发生的。所谓消息处理就是指你的线程所对应的AutoreleasePool在该线程的runloop执行模式下,
// 处理完一个指定的event,比如点击事件,定时器时间,网络传输事件等。所以,你这里设置为nil,该对象并不会真正去调用deinit方法。
deinit
{
// print("这个人被释放掉了")
}
}
class Man: Person {
// override表示重写父类的方法
// 默认初始化方法会自动调用父类的初始化方法
override init() {
super.init()
// print("这是那个男人的构造方法")
}
deinit
{
// print("这个男人被释放掉了")
}
override func sleep() {
print("那个男人在睡觉....")
}
}
var man = Man()
// 使用父类的属性
man.name = "Rinpe"
// 使用父类的方法
//man.sleep()
/*--------------------------测试析构函数---------------------------*/
func f()
{
let person = Person()
person.name = "某某"
}
f()
/*--------------------------测试析构函数---------------------------*/
/*--------------------------多态---------------------------*/
// 多态:父类指针指向子类对象
// 编译的时候是父类, 但真正使用的时候是子类
var personOne: Person = Man()
// 这里调用的其实是子类的方法
personOne.sleep()
func somebodyRun(person: Person) // 这里参数定义的时候用的是父类
{
print("\(person.name)正在跑动")
}
somebodyRun(man) // 这里传参传的是子类
/*--------------------------多态---------------------------*/