• 13.继承


      一个类可以继承另一个类的方法、属性和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。

      在 Swift 中,类可以调用和访问超类的方法、属性和下标,并且可以重写(override)这些方法、属性和下标来优化或修改它们的行为。

    1.定义一个基类:不继承于其它类的类,称之为基类

    • Swift 中的类并不是从一个通用的基类继承而来。如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。这点和OC不同,OC中有一个超类NSObject。
    class SomeSuperclass
    {
        //这里是基类的定义
    }

    2.子类生成:为了指明某个类的超类,将超类名写在子类名的后面,用冒号分隔

    • 子类生成指的是在一个已有类的基础上创建一个新的类。子类继承超类的特性,并且可以进一步完善。 
    class SomeClass: SomeSuperclass
    {
        //这里是子类的定义
    }

    3.重写:如果要重写某个特性,必须在重写定义的前面加上override关键字。

    • 子类可以为继承来的实例方法、类方法、实例属性、或下标提供自己定制的实现

      【说明】:在合适的地方,可以通过使用super前缀来访问超类版本的方法,属性或下标:

    • 在方法someMethod()的重写实现中,可以通过super.someMethod()来调用超类版本的someMethod()方法。
    • 在属性someProperty的 getter 或 setter 的重写实现中,可以通过super.someProperty来访问超类版本的someProperty属性。
    • 在下标的重写实现中,可以通过super[someIndex]来访问超类版本中的相同下标。
    class SuperClass
    {
        var iTemp = 0;
        
        func temp()
        {
            print("SuperClass");
        }
        
        //使用关键字class的类方法可以被重写
        class func testCanOverride()
        {
            print("SuperClass  testCanOverride");
        }
        
        //使用关键字static的类方法不可以被重写
        static func testCanNotOverride()
        {
            print("SuperClass  testCanNotOverride");
        }
    }
    
    class ChildrenClass: SuperClass
    {
    //        override var iTemp = 3;  //错误:子类重写必须为计算属性
        
        override var iTemp: Int
            {
            get {
                return 3;
            }
            set {
                self.iTemp = newValue;
            }
        }
        
        override func temp()
        {
            print("ChildrenClass");
        }
        
        override class func testCanOverride()
        {
            super.testCanOverride();  //先打印父类的对应方法
            print("ChildrenClass testCanOverride");
        }
    }
    
    ChildrenClass.testCanOverride();

      【注意】:

    1. 类方法是使用关键字class修饰的方法(子类可以重写),也可以使用static修饰(子类不可以重写),这时子类就不能重写。static相当于class+final的作用
    2. 子类可以将父类的存储属性和计算属性进行重写,子类重写必须为计算属性(提供gettersetter
    3. 子类可以将只读属性重写为可读写的(提供gettersetter),但是不能将父类的读写属性重写为只读属性(只提供getter
    4. 不能对一个父类let修饰的存储属性在子类中进行重写。因为常量在定义时就被赋值。

    4.防止重写

    • 可以通过把方法,属性或下标标记为final来防止它们被重写,只需要在声明关键字前加上final修饰符即可(例如:final varfinal funcfinal class func,以及final subscript;
    • 在关键字class前添加final修饰符(final class)来将整个类标记为 final 的。这样的类是不可被继承的,试图继承这样的类会导致编译报错
  • 相关阅读:
    简化SpringBoot框架打包体积
    深究1.8版本HashMap源码
    一次面试题,将 字符串 保存在 Byte 数组中
    记一次linux磁盘清理
    Alibaba Cloud Toolkit 使用心得(IDEA版)
    Mybatis 一对多分页踩坑 对collection的分析
    MySQL中update修改数据与原数据相同会再次执行吗?
    与 MySQL 因“CST” 时区协商误解导致时间差了13 小时
    Druid数据源
    mybatis自动生成代码 mybatis-generator
  • 原文地址:https://www.cnblogs.com/LeeGof/p/5681085.html
Copyright © 2020-2023  润新知