类的重写

目录:

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)

        }

    }

}


3.属性观察器

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())")  //调用要执行




你可能感兴趣的:(ios,继承,swift,重写)