天天看點

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. 子類可以将父類的存儲屬性和計算屬性進行重寫,子類重寫必須為計算屬性(提供getter和setter)
  3. 子類可以将隻讀屬性重寫為可讀寫的(提供getter和setter),但是不能将父類的讀寫屬性重寫為隻讀屬性(隻提供getter)
  4. 不能對一個父類let修飾的存儲屬性在子類中進行重寫。因為常量在定義時就被指派。

4.防止重寫

  • 可以通過把方法,屬性或下标标記為final來防止它們被重寫,隻需要在聲明關鍵字前加上final修飾符即可(例如:final var,final func,final class func,以及final subscript);
  • 在關鍵字class前添加final修飾符(final class)來将整個類标記為 final 的。這樣的類是不可被繼承的,試圖繼承這樣的類會導緻編譯報錯

無善無惡心之體,

有善有惡意之動,

知善知惡是良知,

為善去惡是格物。

上一篇: 12.下标
下一篇: 15.析構函數

繼續閱讀