课程来自慕课网liuyubobobo老师
继承和构造函数
- 继承基础
class Role {
var name: String
var life = 100 {
didSet{
if life < 0 {
self.isAlive = false
}
self.isAlive = true
}
}
var isAlive: Bool = true
init(name: String) {
self.name = name
}
func beAttacked(attack: Int) {
life -= attack
}
}
class User: Role {
var score = 0
func getScore(score: Int) {
self.score += score
}
}
// final 不允许再继承
final class Warrior: User {
var weapon: String?
}
class Monster: Role {
func attack(user: User, amount: Int) {
user.beAttacked(attack: amount)
}
}
let player = Warrior(name: "bobo")
player.name // "bobo"
player.life // 100
player.isAlive // true
player.beAttacked(attack: 110)
player.life // -10
player.isAlive // false
- 多态性
let player1 = Warrior(name: "bobo")
let monster1 = Monster(name: "monster1")
// 可以将不同的类统一进行操作
func printRoleName (role: Role) {
print(role.name)
}
printRoleName(player1) // "bobo"
printRoleName(monster1) // "monster"
- 重载
final class Warrior: User {
var weapon: String?
// 重载
override func beAttacked(attack: Int) {
life -= attack/2
}
}
class User: Role {
var score = 0
// 不允许被重载
final func getScore(score: Int) {
self.score += score
}
}
- 两段式构造
class Role {
var name: String
var life = 100 {
didSet{
if life < 0 {
self.isAlive = false
}
self.isAlive = true
}
}
var isAlive: Bool = true
init(name: String) {
self.name = name
}
}
class User: Role {
var score = 0
var group: String
init(name:String, group: String) {
// 构造初值
self.group = group
super.init(name: name)
// 进一步完善
if group == "" {
self.getScore(score: -10)
}
}
final func getScore(score: Int) {
self.score += score
}
}
- 便利构造函数和指定构造函数
class Role {
var name: String
var group: String
init(name: String, group: String) {
self.name = name
self.group = group
}
}
class User: Role {
override init(name: String, group: String) {
if group == "" {
let defaultGroup = "default"
super.init(name: name, group: defaultGroup)
return
}
super.init(name: name, group: group)
}
convenience init(name: String = "visitor"){
self.init(name: name, group: "")
}
}
let visitor1 = User()
visitor1.name // "visitor"
visitor1.group // "default"
- 构造函数的继承
class Role {
var name: String
var group: String
init(name: String, group: String) {
self.name = name
self.group = group
}
convenience init(firstName: String, lastName: String, group: String){
let name = firstName + " " + lastName
self.init(name: name, group: group)
}
}
class User: Role {
override init(name: String, group: String) {
if group == "" {
let defaultGroup = "default"
super.init(name: name, group: defaultGroup)
return
}
super.init(name: name, group: group)
}
convenience init(name: String = "visitor"){
self.init(name: name, group: "")
}
}
class Monster: Role {
convenience init(type: String) {
// 自己的指定构造函数是由父类继承而来
self.init(name: type, group: type)
}
}
// 如果子类实现了父类所有的指定构造函数,则自动继承父类的的所有便利构造函数
let visitor1 = User(firstName: "John", lastName: "Snow", group: "Ice and Fire")
// 如果子类没有实现任何父类的指定构造函数,则自动继承父类的所有指定构造函数,并继承父类的便利构造函数
let monster1 = Monster(name: "monster", group: "monster")
- required构造函数
class Role {
var name: String
var group: String
// 需要子类必须实现的构造函数
required init(name: String, group: String) {
self.name = name
self.group = group
}
}
class User: Role {
// 子类重载父类指定的构造函数 override关键词更改为required
required init(name: String, group: String) {
if group == "" {
let defaultGroup = "default"
super.init(name: name, group: defaultGroup)
return
}
super.init(name: name, group: group)
}
}
网友评论