加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift 类的继承 convenience required

发布时间:2020-12-14 06:26:17 所属栏目:百科 来源:网络整理
导读:看下面的代码 class Person { var name: String var health:Int = 100 { didSet{ if self.health 100 { self.health = 100 } if self.health = 0 { self.isAlive = false } } } var isAlive:Bool = true var description: String { return "i am a person,na

看下面的代码

class Person {
    var name: String
    var health:Int = 100 {
        didSet{
            if self.health > 100 {
                self.health = 100
            }
            
            if self.health <= 0 {
                self.isAlive = false
            }
        }
    }
    var isAlive:Bool = true
    var description: String {
        return "i am a person,name is (self.name)"
    }
    
    init(name: String) {
        self.name = name
    }
    
    func beAttacted(health:Int) -> Void {
        self.health -= health
    }
    
    // 加上final不能被子类重写
    final func getHealth() -> Int {
        return self.health
    }
}

func cure(person:Person) {
    person.health += 10
}

class Solider: Person {
    var weapon: String?
    override var description: String { // 类的重载
        return "i am a Solider,name is (self.name)"
    }
    
    override func beAttacted(health:Int) -> Void { // 重载方法
        self.health -= health/2
    }
}

class Worker: Person {
    var work: String?
    override var description: String { // 类的重载
        return "i am a Worker,name is (self.name)"
    }
}

// final 表示不可被继承
final class Taxpayer: Worker {
    var taxRate:Float = 0
}

var solider = Solider(name: "solider")
cure(person: solider)
solider.health
print(solider.description)

var worker = Worker(name: "worker")
cure(person: worker)
worker.health
print(worker.description)

上面打印结果

i am a Solider,name is solider

i am a Worker,name is worker

i am a Solider,name is worker


Swift 的两段式构造

class Person {
    var name: String
    var health:Int = 100 {
        didSet{
            if self.health > 100 {
                self.health = 100
            }
            
            if self.health <= 0 {
                self.isAlive = false
            }
        }
    }
    var isAlive:Bool = true
    var description: String {
        return "i am a person,name is (self.name)"
    }
    
    init(name: String) {
        self.name = name
    }
    
    func beAttacted(health:Int) -> Void {
        self.health -= health
    }
    
    // 加上final不能被子类重写
    final func getHealth() -> Int {
        return self.health
    }
}

class Solider: Person {
    var weapon: String
    override var description: String { // 类的重载
        return "i am a Solider,name is (self.name)"
    }
    
    override func beAttacted(health:Int) -> Void { // 重载方法
        self.health -= health/2
    }
    
    init(weapon: String,name:String) { // swift两段式构造,先构造子类的元素,再构造父类的元素
        self.weapon = weapon
        super.init(name: name)
    }
}

class Person {
    var name: String
    var health:Int = 100 {
        didSet{
            if self.health > 100 {
                self.health = 100
            }
            
            if self.health <= 0 {
                self.isAlive = false
            }
        }
    }
    var isAlive:Bool = true
    var description: String {
        return "i am a person,name is (self.name)"
    }
    
    required init(name: String) { // 必须实现的构造函数
        self.name = name
    }
    
    convenience init(firstname:String,lastname: String) { //方便构造函数
        self.init(name:firstname + "" + lastname)
    }
    
    func beAttacted(health:Int) -> Void {
        self.health -= health
    }
    
    // 加上final不能被子类重写
    final func getHealth() -> Int {
        return self.health
    }
}

class Solider: Person {
    var weapon: String
    override var description: String { // 类的重载
        return "i am a Solider,name:String) { // swift两段式构造,先构造子类的元素,再构造父类的元素
        self.weapon = weapon
        super.init(name: name)
    }
    
    convenience init(weapon:String) { // 方便构造函数,调用自己已有的构造函数,无法调用super.init
        let name = "Solider"
        self.init(weapon: weapon,name:name)
    }
    
    convenience required init(name: String) {
        self.init(weapon: "gun",name:name)
    }
}

var s = Solider(firstname: "s",lastname: "r")
s.weapon

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读