天天看點

窺探Swift之類的繼承與類的通路權限

  今天的部落格在類的内容中還是比較重要的,同時也是比較基礎的東西,當然很有必要好好的搞一下喽。在介紹繼承和通路權限時,在恰當的地方會類比一下objc, 如果你沒有接觸過objc, 那麼沒關系,你可以把類比的部分給忽略掉,這并不影響你對swift相應内容的了解。好~開始今天部落格的内容。

  一. 類的繼承

  其實繼承了解起來還是蠻簡單的,說白了就是子承父業。子類可以繼承父類的一些東西,在繼承之時,父類可以選擇一些東西留給子類,同時也可以保留一些東西作為私有(private)物品。同樣,子類也可以選擇一些東西進行繼承,如果對繼承的東西不太滿意,子類就可以對繼承過來的東西進行重新改造(override)以滿足自己的需求。如果要定義抽象類,隻需把該類的構造器定義為私有即可。下方将會給出類的繼承的一些示例,通過這些事例來認識一下swift中的繼承。

  1. 父類的建立

    這裡我們建立一個名為father的父類,他類可以繼承father類。在father類中有兩個初始值為空串的屬性變量,并且有一個含有預設值參數的構造器,還有一個是輸出變量值的displayallname()的方法。類中的代碼比較簡單,具體如下所示。

    如果要定義抽象類,隻需把上面的構造器進行一個修改即可。抽象類即為專門用來做其他類的父類的類,抽象類不能夠直接被執行個體化,是以把其構造器定義為私有的就可以達到不能直接被執行個體化的目的。如果要把上述類修改成抽象類,那麼把上面的構造函數替換成下方私有的構造函數即可。

  2.實作father的子類children

    children類繼承自father類,并在father類的基礎上做了相應的擴充。children中的構造器調用了父類的構造器來對父類的一些屬性進行初始化,當然,你也可以直接使用self來通路父類的非私有屬性進行初始化,因為children是繼承自father的,是以father中非私有的東西都是視為己有的是以可以使用self來通路父類非私有的東西。子類持有了父類的非私有的東西,同時還可以增加屬于自己的東西,子類肯定是要在父類的基礎上在添加一些屬于自己特有的東西。children添加了父類中沒有的job和displaymyjob的方法。

  3.children類的執行個體化

    chidren就是個類,其使用方式沒有什麼特别之處,就是調用構造器來進行類的執行個體化。執行個體化後,就可以調用類的非私有的屬性和方法了,具體代碼如下:

  4.防止類的子類化

    抽象類的使命是專門用來繼承的,而有些類是不想讓其他類進行繼承的(丁克家族)。舉個例子,有些小夫妻呢,就不想要孩子,那麼怎麼辦呢?在swift中也是有final關鍵字的,被final關鍵字所修飾的類是不能用來繼承的。我們可以把father類定義成final類型,并觀察children發生的變化。下方是修改後father類的代碼:

    father添加上final關鍵字修飾後如果children還對其進行繼承那麼就會報下面的錯誤,如下所示:

窺探Swift之類的繼承與類的通路權限

  二、通路權限

    swift中的通路權限與其他面向對象程式設計語言有所不同,雖然swift中的通路權限也分為3個等級,但是每個等級所能通路的區域與其他程式設計語言相比還是有些差別的。在swift的通路權限包括public, private, internal三種通路級别。下面将要對這三個級别一一進行介紹。

public: 公有通路權限,類或者類的公有屬性或者公有方法可以從檔案或者子產品的任何地方進行通路。那麼什麼樣才能成為一個子產品呢?一個app就是一個子產品,一個第三方api, 第三等方架構等都是一個完整的子產品,這些子產品如果要對外留有通路的屬性或者方法,就應該使用public的通路權限。

private: 私有通路權限,被private修飾的類或者類的屬性或方法可以在同一個實體檔案中通路。如果超出該實體檔案,那麼有着private通路權限的屬性和方法就不能被通路。

internal: 顧名思義,internal是内部的意思,即有着internal通路權限的屬性和方法說明在子產品内部可以通路,超出子產品内部就不可被通路了。在swift中預設就是internal的通路權限。

    關于通路權限的執行個體就不過贅述了,了解起來還算是簡單的,今天的部落格就先到這兒,接下來回繼續更新關于swift相關的部落格。如有錯誤還望批評指正。

繼續閱讀