Swift 系统学习 26 Swift语言中的继承, 多态和重写

//: Playground - noun: a place where people can play

import UIKit

/*
 * 本节主要内容:
 * 1.Swift语言中的继承, 多态和重写
 */

/*
 * 父类: 
    角色Avatar
 * 子类: 
    Player: Avatar
    Monster: Avatar
 * 子类: 
    Magician: Player
    Warrior: Player
 * 子类:
    Zombie: Monster
 */


/*
 * override重写;overwrite: 子类的方法覆盖父类的方法, 要求方法名和参数都必须相同, 访问权限不可以更严格; 
--> Swift扩展: 还可以重写属性(例如: 计算型属性)
 * overload重载: 在同一个类中的两个方法/多个方法, 拥有相同的方法名, 但是参数不同(参数个数/参数类型); 例如: Swift中init构造方法
 */

/*
 * final(最终的)
   --> 属性: 意味着子类无法重写该属性
   --> 方法: 意味着子类无法重写该方法
   --> 类:   意味着该类不能被继承
 */

func functionName() {
    print("hello ")
}

// 先创建父类: 角色
class Avatar {
    // 名字
    var name: String
    // 是否活着
    var isAlive: Bool = true
    // 生命值
    var life = 100 {
        didSet {
            // 赋值成功之后的状态描述
            if life <= 0 {
                isAlive = false
            } else if life > 10000 {
                life = oldValue
            }
        }
    }
    
    // 添加描述计算型属性
    var description: String {
        return "I'm Avatar: \(name)"
    }
    
    init(name: String) {
        self.name = name
    }
    
    // 自定义方法: 收到多少点攻击
    func beAttacked(attack: Int) {
        life -= attack
        
        if life <= 0 {
            isAlive = false
        }
    }
}

// 玩家类
class Player: Avatar {
    // 玩家独有的属性
    var score = 0 // 分数
    var level = 1 // 等级
    
    // 重写父类的属性
    override var description: String {
        return "I'm Player \(name)"
    }
    
    func getScore(score: Int) {
        self.score += score
        // 升级
        if self.score > level * 100 {
            level += 1
        }
    }
}

// 创建魔术师类
class Magician: Player {
    // 魔法值
    var magic = 100
    
    // 重写父类的属性
    override var description: String {
        return "I'm Magician \(name)"
    }
    
    // 治疗(加生命值)
    func heal(player: Player) {
        player.life += 10
    }
}
// 创建战士类
class Warrior: Player {
    var weapon: String?
    
    // 重写父类的属性
    override var description: String {
        return "I'm Warrior \(name)"
    }
    
    // 子类重写父类的方法
    override func beAttacked(attack: Int) {
        life -= attack / 2
    }
}

// 创建怪兽类
class Monster: Avatar {
    
    // 重写父类的属性
    override var description: String {
        return "I'm Monster \(name)"
    }
    
    func attack(player: Player, amount: Int) {
        player.beAttacked(attack: amount)
    }
}

// 创建僵尸类
class Zombie: Monster {
    // 类型
    var type = "Default"
    
    // 重写父类的属性
    override var description: String {
        return "I'm Zombie \(name)"
    }
}
// 实例化
let magician = Magician(name: "Harray Potter")
let warrior = Warrior(name: "Iron Man")
let zombie  = Zombie(name: "Vampire")
let monster = Monster(name: "Gorilla")

// 声明函数, 体现多态性
func printBasicInfo(avatar: Avatar) {
    print("The avatar's name is \(avatar.name)")
    print("The life is \(avatar.life). He is \( (avatar.isAlive) ? "still alive" : "dead")")
}
// 调用函数
printBasicInfo(avatar: magician)
printBasicInfo(avatar: warrior)
printBasicInfo(avatar: zombie)
printBasicInfo(avatar: monster)


/*
 * 课堂练习:
 * 1. 创建三个类,父类是描述专辑类Album, 两个子类, 分别描述录音室专辑类StudioAlbum和现场版专辑LiveAlbum
 * 2.父类: 专辑名字(属性), init, 自定义方法(返回字符串: 反应销售情况)
 * 3.StudioAlbum: 录音室名字(属性), init, 重写父类的自定义方法
 * 4.LiveAlbum: 现场名字(属性); init, 重写父类的自定义方法
 * 5.声明数组, 元素类型Album, 元素的值是实例化对象, 循环打印每个对象的属性的值
 */















猜你喜欢

转载自blog.csdn.net/clarence20170301/article/details/59108919