类的重写

本文详细介绍了Swift语言中关于继承和重写的概念,包括方法、属性及属性观察器的重写,构造器在继承中的调用规则等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

1.重写方法

2.重写属性

3.重写属性观察器

4.构造器在继承中的调用规则


重定写方法:

方法前加override关键字。

class Animal {

    var eyes : Int

    var month : Int

    var nose : Int

    var voice : String

    

    init(){

        eyes = 2

        month = 0

        nose = 0

        voice = "voice"

    }

    

    func description() -> String {

        return "\(eyes) eyes ; up to \(month) month"

    }

}



class Cat: Animal {


    override init() {    //重写方法

        super.init()

        voice = "miao"

    }

    

    override var eyes: Int{  //重写属性

    

        get{

           return super.eyes

        }

        set{

           super.eyes = max(newValue, 100)

        }

    }

}


class smallCat: Animal {

    var large = 1

    override var month: Int{ //属性观察器被重写

    

        didSet{

        

            large = Int(month*2)

        }

    }

    

    override func description() -> String {

        return super.description() + "in gear \(large)"

    }

}


let automatic = smallCat()

automatic.month = 1

print("Automatic :\(automatic.description())")



4.构造器在继承中的调用规则
1.如果一个指定构造器被继承,那么所有调用该指定构造器的便利构造器也会被继承。
2.如果在子类中没有实现任何的指定构造器,那么子类会继承父类的所有指定构造器,当然,所有的便利构造器也会被同时继承。

1)便利构造器。

class Food {

    var name:String

    //指定构造器

    init(name:String){

       self.name = name

    }

    //便利构造器

    convenience init(){

    

        //调用指定构造器

        self.init(name:"[Unnamed]")

    }

}


//使用指定构造器创建Food对象

let namedMeat = Food(name:"Bacon")

//使用便利构造器创建Food对象,name的值是“[Unnamed]”

let mysteryMeat = Food()


print(mysteryMeat)

print(namedMeat)



2)构造器被继承

class Food2 {

    

    var name : String

    

    init(name:String){

    

       self.name = "nameStr"

    }

    init(){

        self.name = ""

    }

}


class Apple2: Food2 {

}


var apple1 = Apple2()     //Apple2

var apple2 = Apple2(name:"apple2"//Apple2

print("apple1 \(apple1.name)")     //"apple1 \n"

print("apple2 \(apple2.name)")     //"apple2 nameStr\n"



#===========================================================================================================

在swift中必须要显示调用父类的构造器,而且必须调用。

如下是错误的:

class Food2 {

    

    var name : String

    

    init(name:String){

    

       self.name = "nameStr"

    }

    init(){

        self.name = ""

    }

}


class Apple2: Food2 {

    override init(name: String) {

        super.init()

        self.name = "apple2 nameStr"

    }

    

//    override init() {

//        super.init()

//        self.name = ""

//    }

}


var apple1 = Apple2()  //不可用。子类中必须也重写才可以。没有继承父类。

var apple2 = Apple2(name:"apple2")

print("apple1 \(apple1.name)")

print("apple2 \(apple2.name)")



修改后,正确

class Food2 {

    

    var name : String

    

    init(name:String){

    

       self.name = "nameStr"

    }

    init(){

        self.name = ""

    }

}


class Apple2: Food2 { //如果构造函数要重写,则所有构造函数都需要被重写

    override init(name: String) {

        super.init()

        self.name = "apple2 nameStr"

    }

    

    override init() {

        super.init()

        self.name = ""

    }

}


var apple1 = Apple2()

var apple2 = Apple2(name:"apple2")

print("apple1 \(apple1.name)")

print("apple2 \(apple2.name)")



重写父类的普通函数

class Food2 {

    

    var name : String

    

    init(name:String){

    

       self.name = "nameStr"

    }

    init(){

        self.name = ""

    }

    

    func test() {

        print("this is food2.")

    }

}


class Apple2: Food2 {


    override func test() {

        print("apple2")        //被执行

    }

}


var apple0 = Apple2()

print("this is \(apple0.test())")  //调用要执行




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值