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 的。这样的类是不可被继承的,试图继承这样的类会导致编译报错
posted @ 2016-07-18 14:29  LeeGof  阅读(210)  评论(0编辑  收藏  举报