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

来源:互联网 发布:c 代理商系统源码 编辑:程序博客网 时间:2024/06/05 01:07
//: Playground - noun: a place where people can playimport 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, 元素的值是实例化对象, 循环打印每个对象的属性的值 */


0 0
原创粉丝点击