Swift中构造器的继承和重写

import Foundation

/*
构造器的继承:
Swift的子类不会自动继承父类的构造器, 若继承, 则满足如下规则:
1.如果子类没有提供任何指定构造器, 那么它将自动继承父类的所有指定构造器
2.如果子类实现了父类所有的指定构造器, 无论如何实现的, 都将自动继承父类的所有便利构造器
*/

/*
构造器的重写:
1.子类构造器重写了父类的指定构造器, 必须添加override修饰符
2.子类中定义的构造器只是和父类中便利构造器的形参列表, 外部形参名相同, 不算重写
*/

/*
总结:
1.如果一个子类没有定义任何构造器, 那么它将自动继承父类中的所有构造器
2.如果一个子类重写父类的所有指定构造器, 那么它将自动继承父类中的所有便利构造器
3.如果一个子类中任意的构造器和父类的便利构造器一模一样, 不算重写, 创建对象的时候也只会显示子类定义的构造器
*/

class Person {

    var name: String!
    var weight: Double

    init(name: String) {
        self.name = name
        self.weight = 0.0
    }

    // 定义指定构造器
    init(name: String, weight: Double) {
        self.name = name
        self.weight = weight
    }

    // 定义便利构造器(使用convenience修饰)
    convenience init(n name: String, w weight: Double) {
        // 便利构造器必须调用同类中的指定构造器
        self.init(name: name, weight: weight)
    }

    convenience init(showStr: String) {
        self.init(name: "", weight: 0.0)
        print(showStr)
    }
}

class Man: Person {

    var sex: String = "男"

    override init(name: String) {
        // 子类的指定构造器中必须调用父类的指定构造器
        super.init(name: name)
        self.name = name
        self.weight = 0.0
    }

    override init(name: String, weight: Double) {
        super.init(name: name, weight: weight)
        self.name = name
        self.weight = weight
    }

    // 定义指定构造器与父类的便利构造器一样, 这里不算重写
    convenience init(showStr: String) {
        self.init(name: "", weight: 0.0)
        print(showStr)
    }
}

var man = Man(name: "Rinpe", weight: 62.0)
var man1 = Man(showStr: "HelloWorld")

  

时间: 2024-10-04 12:44:43

Swift中构造器的继承和重写的相关文章

《Swift Programming Language 》——Swift中如何使用继承(Inheritance)

一个类可以继承(inherit)另一个类的方法(methods),属性(property)和其它特性.当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass).在 Swift 中,继承是区分「类」与其它类型的一个基本特征. 在 Swift 中,类可以调用和访问超类的方法,属性和附属脚本(subscripts),并且可以重写(override)这些方法,属性和附属脚本来优化或修改它们的行为.Swift 会检查你的重写定义在超类中是否有匹配的定义,以此确

《Swift Programming Language 》——Swift中怎样使用继承(Inheritance)

一个类能够继承(inherit)还有一个类的方法(methods),属性(property)和其他特性.当一个类继承其他类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass).在 Swift 中,继承是区分「类」与其他类型的一个基本特征. 在 Swift 中,类能够调用和訪问超类的方法,属性和附属脚本(subscripts),而且能够重写(override)这些方法,属性和附属脚本来优化或改动它们的行为.Swift 会检查你的重写定义在超类中是否有匹配的定义,以此

Swift 中的静态方法继承

Base and Derived Classes: class BaseClass{ class func staticMethod(){ println("BaseClass.staticMethod") } class func staticMethodWithSelfCall(){ self.staticMethod() } func instanceMethodWithStaticCall(){ self.dynamicType.staticMethod() } } class

c# 中面相对性的三个特点:封装,继承,多态, 以及c#中隐藏(new)和方法重写(override)和重载(overload)的区别

封装 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3) 访问修饰符 声明的可访问性                                 含义 public                                    访问不受限制. protected                              访问仅限于本类或者其子类(可以跨程序集). p

浅析 Java 中的继承和重写

Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被子类继承,final 不能修饰构造方法. Java 中子类可以继承父类的私有成员,但是不能(直接)访问,私有方法不可以重写. 原文地址:https://www.cnblogs.com/hglibin/p/11247597.html

【Swift学习】Swift编程之旅---继承(十七)

在 Swift 中,继承是区分「类」与其它类型的一个基本特征.swift不支持多重继承.类可以调用和访问超类的方法,属性和subscripts下标,并且可以重写(override)这些方法,属性和附属脚本来优化或修改它们的行为.Swift 会检查你的重写定义在超类中是否有匹配的定义,以此确保你的重写行为是正确的. 可以为类中继承来的属性添加属性观察器(property observer),这样一来,当属性值改变时,类就会被通知到.可以为任何属性添加属性观察器,无论它原本被定义为存储型属性(sto

Swift中的结构体,类,协议,扩展和闭包的用法以及? 和 !的区别

// MARK: - 1.结构体 //1.声明一个结构体 struct Rect {    // 声明结构体变量的属性(存储属性)    var x:Float    var y:Float    var width:Float    var height:Float    // 声明结构体属性,要使用static    static var description:String?        // 声明一个计算属性(是用来专门计算结构体变量属性的setter,和getter方法,其本身没有存

浅谈swift中的那些类,结构以及初始化的操作

首先呢,我们先声明一个类 class Parent { //声明一个属性 var p1: String = "abc" //声明一个方法 func m() { print("parent m") } //声明一个静态的方法 final func n(){ } } 然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new 一个的话, 直接调用该类就可以了) var par = Parent() 调用parent的方法和属性 par.m()

swift中构造方法和Kvc

一.引言 构造方法是一个类创建对象最先也是必须调用的方法,在Objective-C中,开发者更习惯称这类方法为初始化方法.在Objective-C中的初始化方法与普通函数相比除了要以init抬头外并无太严格的分界,而在Swift语言体系中,构造方法与普通的方法分界十分严格,从格式写法上就有不同,普通方法函数要以func声明,构造方法统一为init命名,不需要func关键字声明,不同的构造方法采用方法重载的方式创建. 二.构造方法的复写与重载 在Objective-C中,不同的初始化方法就是不同的