当前位置: 澳门新濠3559 > 编程 > 正文

 指定构造与便利构造器方法, 新的类能够继承

时间:2019-11-01 10:04来源:编程
/* /*  继承与构造方法:  继承语法  指定构造与便利构造器方法  继承是面向对象最显著的一个特性, 继承是从已经有的类中派生出新的类  */  新的类能够继承已有类的属性和方法, 并

/*

/*

 继承与构造方法:

 继承语法

 指定构造与便利构造器方法

 继承是面向对象最显著的一个特性, 继承是从已经有的类中派生出新的类

 */

 新的类能够继承已有类的属性和方法, 并能扩展新的能力

 

 术语: 基类(父类, 超类), 派生类(子类, 继承类)

class Person {

 语法:

    var name:String

 class 子类: 父类{

    var age:Int

 }

    //指定构造方法都是以init开头

 

    init(name:String, age:Int)

 继承优点: 代码重用

    {

 继承缺点: 增加程序耦合度, 父类改变会影响子类

        self.name = name

 注意:Swift和OC一样没有多继承

        self.age = age

 */

    }

 

    //1.如果是值类型没问题, 称之为构造器代理;

class Man {

    //2.但是如果是引用类型报错, 需要在前面加上 convenience关键字;

    var name: String = "hjq"

    //3.被convenience关键字修饰的构造方法称之为便利构造器, 通过调用其他构造方法来初始化;

    var age: Int = 23

    //4.反而言之, 便利构造器中一定是调用其他构造方法初始化的, 一定要出现self.init

    func sleep()

    convenience init()

    {

    {

        print("睡觉")

        self.init(name: "hjq", age: 26)

    }

    }

}

    //类可以拥有多个构造方法

//继承Man的子类

    init(name:String)

class SuperMan: Man {

    {

    var power: Int = 100

        self.name = name

    func fly() {

        self.age = 0

        //子类可以继承父类的属性

        //不能再指定构造方法中调用便利构造器方法

        print("飞 (name) (age)")

        //换言之,指定构造方法中不能出现self.init

    }

//        self.init()

}

    }

var m = Man()

    

m.sleep()

    convenience init(age:Int)

//父类不可以使用子类的方法

    {

//m.fly()

        //可以在便利构造器中调用指定构造器

 

//        self.init(name: "hjq", age: 24)

var sm = SuperMan()

        self.init()

//子类可以继承父类的方法

    }

sm.sleep()

    // 便利构造器不能和指定构造器同名

sm.fly()

    //    convenience init(name:String)

 

    //    {

print("==============================================")

    //    }

 

}

/*

 

 super关键字:

 

 

/** 派生类的构造方法 **/

 派生类(子类)中可以通过super关键字来引用父类的属性和方法

 

 */

class Man {

 

    var name:String

class Man2  {

    //指定构造方法

    var name: String = "HaRi"

    init(name:String)

    var age: Int = 20

    {

    func sleep()

        self.name = name

    {

    }

        print("睡吧!")

    convenience init(){

    }

        self.init(name: "hjq")

}

    }

 

}

class SuperMan2: Man2 {

class SuperMan: Man {

    var power: Int = 100

    var age:Int

    func eat()

    

    {

    // 注意:

        print("吃饭喽!")

    // 1.默认情况下构造方法不会被继承

    }

    // 2.基类的存储属性只能通过基类的构造方法初始化

    func fly()

    // 3.初始化存储属性时必须先初始化当前类再初始化父类

    {

    // 4.不能通过便利构造方法初始化父类, 只能通过调用指定构造方法初始化父类

        //子类可以继承父类的属性

    //指定构造器

        print("飞 (name) (age)")

    init(age:Int) {

    }

        self.age = age

    func eatAndSleep()

        super.init(name: "han")

    {

//        super.init()

        eat()

    }

        //1.如果没有写super, 那么会在当前类中查找, 如果找不到才会再去父类中查找;

}

        //2.如果写了super, 会直接去父类中查找.

 

        super.sleep()

/*

    }

 构造器间的调用规则:

}

 1.指定构造器必须调用其直接父类的"指定构造器"

var sm2 = SuperMan2()

 2.便利构造器必须调用同类中的其他便利构造器(指定或者便利)

sm2.eatAndSleep()

 3.便利构造器必须最终调用一个指定构造器结束(无论指定还是便利, 最终肯定调用一个指定构造器)

 

 4.指定构造器总是横向代理(父类)

print("==============================================")

 5.便利构造器总是横向代理(子类)

 

 */

/*

 

 方法重写: override

class Man2 {

 重写父类方法, 必须加上 override 关键字

    var name:String

 */

    //指定构造器

 

    init(name:String) {

class Man3 {

        self.name = name

    var name: String = "HanJunqiang"

    }

    var age: Int = 24

    convenience init(){

    func sleep()

        self.init(name: "HaRi")

    {

    }

        print("睡觉

编辑:编程 本文来源: 指定构造与便利构造器方法, 新的类能够继承

关键词:

  • 上一篇:没有了
  • 下一篇:没有了