澳门至尊网站-首页

您的位置:澳门至尊网站 > 搜索引擎 > 构造方法

构造方法

2019-11-14 18:25

/*

 继承与构造方法:

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

 */

 

class Person {

    var name:String

    var age:Int

    //钦赐构造方法皆以以init开头

    init(name:String, age:Int)

澳门至尊网站,    {

        self.name = name

        self.age = age

    }

    //1.要是是值类型没难点, 称之为构造器代理;

    //2.然则若是是援用类型报错, 须求在前头加上 convenience关键字;

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

    //4.反来讲之, 便利构造器中一定是调用任何构造方法起头化的, 必须要现身self.init

    convenience init()

    {

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

    }

    //类能够具备几个构造方法

    init(name:String)

    {

        self.name = name

        self.age = 0

        //不能够再钦赐构造方法中调用便利构造器方法

        //换言之,内定构造方法中不能够冒出self.init

//        self.init()

    }

    

    convenience init(age:Int)

    {

        //能够在便利构造器中调用钦赐构造器

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

        self.init()

    }

    // 便利构造器无法和点名构造器同名

    //    convenience init(name:String)

    //    {

    //    }

}

 

 

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

 

class Man {

    var name:String

    //钦点构造方法

    init(name:String)

    {

        self.name = name

    }

    convenience init(){

        self.init(name: "hjq")

    }

}

class SuperMan: Man {

    var age:Int

    

    // 注意:

    // 1.暗中同意意况下构造方法不会被延续

    // 2.基类的仓库储存属性只好通过基类的构造方法伊始化

    // 3.初叶化存款和储蓄属性时必须先初步化当前类再伊始化父类

    // 4.不可能经过有扶助构造方法初步化父类, 只好透过调用钦点构造方法最早化父类

    //钦定构造器

    init(age:Int) {

        self.age = age

        super.init(name: "han")

//        super.init()

    }

}

 

/*

 构造器间的调用准绳:

 1.钦定构造器必得调用其一贯父类的"钦赐构造器"

 2.便利构造器必得调用同类中的别的便利构造器(内定只怕福利)

 3.便利构造器必须最后调用三个点名构造器停止(无论内定照旧低价, 最后必然调用一个点名构造器)

 4.钦点构造器总是横向代理(父类)

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

 */

 

class Man2 {

    var name:String

    //钦命构造器

    init(name:String) {

        self.name = name

    }

    convenience init(){

        self.init(name: "HaRi")

    }

}

class SuperMan2: Man2 {

    var age:Int

    //钦定构造器

    init(age:Int) {

        self.age = age

        super.init(name: "xiaohange")

    }

    convenience init()

    {

        self.init(age: 25)

    }

    convenience  init(name: String, age: Int) {

        //调用子类构造器一定能够带头化全数属性

//        self.init(age: 30)

        //便利构造器中只可以通过self.init来伊始化, 不能够使用 super.init

        //因为调用父类构造器不明确完全发轫化全部属性(子类持有)

//        super.init(name: "han")

        self.init()

    }

}

 

/*

 两段式构造----构造进程能够分开为多个品级:

 1.保险当前类和父类全体存款和储蓄属性都被伊始化;

 2.做一些别的初步化操作.

 好处:

 1.足以卫戍属性在被初叶化前会见;

 2.得以制止属性被别的其余一个协会器意外赋值.

 注意:

 构造器的开首化永恒是在全部类的率先等第初步化达成后才会起头第二阶段.

 

 编写翻译器安检:

 1.必得先开端化子类特有总体性, 再前行代理父类钦赐构造方法初阶化父类属性;

 2.只好在调用完父类指定构造器后技艺访谈父类属性;

 3.在便利构造器中, 必需先调用通类其他构造方法后能力访谈属性;

 4.先是等级完结前无法访问父类属性, 也不可能引用 self 和调用任何实例方法

 */

 

class Man3 {

    var name:String

    //钦命构造方法

    init(name:String) {

        self.name = name

    }

    //便利构造方法

    convenience init(){

        self.init(name: "hello world")

    }

}

 

class SuperMan3: Man3 {

    var age:Int

    init(age:Int) {

        print("SuperMan第意气风发品级初叶")

        //对子类引进的习性开首化

        self.age = age

        

        //代码会报错, 因为调用self.name在此之前还不曾对父类的name举行最早化

        //就算在此个地对古籍标点改正勘, 也会被前边的开端化语句覆盖

//        if age > 30 {

//            self.name = "hjq"

//        }

        //对父类引进的天性举办伊始化

        super.init(name: "han")

        

        print("SuperMan第二等第开端")

        if age > 30 {

            self.name = "hello xiaohange"

        }

    }

}

class MonkeyMan: SuperMan3 {

    var height:Double

    init(height:Double) {

        print("MokeyMan第风姿洒脱品级开头")

        //对子类引进的性子初叶化

        self.height = 100.0

        //对父类引进的性质进行伊始化

        super.init(age: 40)

        

        print("MokeyMan第二品级开端")

        if height < 110.0 {

            self.age = 40

        }

    }

}

var m = MonkeyMan(height: 31)

 

 

/** 重写钦定构造方法:子类的构造方法和父类的一模一样 **/

class Man4 {

    var name:String

    init(name:String) {

        self.name = name

    }

}

class SuperMan4: Man4 {

    var age:Int

    init() {

        self.age = 25

        super.init(name: "xiaohange")

    }

    

    //将父类的内定构造器重写成贰个便利构造器, 必需抬高override关键字, 表示重写父类方法

    convenience override init(name: String) {

        self.init(name: name)

        self.age = 50

    }

}

 

 

/** 便利构造方法空头支票重写 **/

class Man5 {

    var name:String

    init(name:String) {

        self.name = name

    }

    convenience init(){

        self.init(name:"hello")

    }

}

 

class SuperMan5: Man5 {

    var age:Int

    init(age:Int) {

        self.age = age

        super.init(name: "hi")

    }

    //1.斯威夫特中有益构造方法一纸空文重写, 假设加上override关键字, 系统会去搜寻父类中有没有和有利构造方法相同的钦点构造方法, 有旧不报错, 未有就报错

    //2.为何便利构造器无法重写吧? 因为便利构造器只好横向代理, 只好调用当前类的别的构造方法或内定方法, 不容许调用super. 所以不设有重写

    //3.也正是说子类的便利构造方法不可能平昔访谈父类的方便构造方法, 所以子虚乌有重写的定义

    convenience init(){

        self.init(age: 30)

    }

}

//刚开始阶段版本中只要字符类中有同名便利构造器会报错, 以后则不会.

var sm = SuperMan5()

print("name = (sm.name)  age = (sm.age)")

 

 

 

/*

 构造方法的机动一连:

 1.万一子类中从未概念构造器, 且子类全部的囤积属性都有缺省值, 会世袭父类中颇负的构造方法(包含便利构造器);

 2.假如子类中只是重写全数的指定构造器, 不管仲类中的存款和储蓄属性是否有缺省值, 都不会三回九转父类的别的构造方法;

 3.假诺子类重写了父类中的钦命构造器, 不管敬仲类中的存款和储蓄属性是还是不是有缺省值, 都会相同的时候继续父类中的全部便民方法.

 */

class Person6 {

    var name:String

    var age:Int

    init(name:String, age:Int) {

        self.name = name

        self.age = age

    }

    init(name:String) {

        self.name = name

        self.age = 0

    }

    convenience init()

    {

        self.init(name: "HaRi")

    }

}

class SuperMan6: Person6 {

    var height:Double

    init(height:Double) {

        self.height = height

        super.init(name: "han", age: 25)

    }

    override init(name: String, age: Int) {

        self.height = 178.0

        super.init(name: name, age: age)

    }

    override init(name: String) {

        self.height = 178.0

        super.init(name: name)

    }

}

// 假诺子类中未有定义任何构造器, 且子类中保有的贮存属性都有缺省值, 会世袭父类中全部的构造方法(包涵便利构造器)

// 父类的蕴藏属性是由父类的布局器带头化, 子类的积累属性是由缺省值起先化的

//var sm = SuperMan6(name: "han", age: 30)

//var sm = SuperMan6(name: "hjq")

//var sm = SuperMan6()

//print(sm.height)

 

// 如若子类中只是重写了父类中的有些钦定构造器, 不管仲类中的存款和储蓄属性是还是不是有缺省值, 都不会三番四遍父类中的其余构造方法

//var sm = SuperMan(height: 198.0)

 

// 倘诺子类重写了父类中享有的钦定构造器, 不管仲类中的存款和储蓄属性是或不是有缺省值, 都会同不经常候继续父类中的全体方便人民群众措施

var sm6 = SuperMan6()

 

 

 

/*

 必需构造器:

 只要在构造方法的前方加上四个 required 关键字, 那么全体的子类(后续子类)只要定义了构造方法都必须得以完结该构造方法

 */

class Person7 {

    var name:String

    required init(name:String){

        self.name = name

    }

}

class SuperMan7: Person7 {

    var age:Int

    init() {

        self.age = 24

        super.init(name: "hjq")

    }

    required init(name: String) {

        self.age = 24

        super.init(name: name)

    }

}

var sm7 = SuperMan7(name: "hjq")

 

本文由澳门至尊网站发布于搜索引擎,转载请注明出处:构造方法

关键词: