上一篇博客《Swift - Struct & Class》的博客可謂是給Swift中的類開了個頭。關於類的內容還有很多,今天就來搞一下類中的繼承以及類的訪問權限。說到類的繼承,接觸過面向對象編程(OOP)的小夥伴並不陌生,繼承就是OOP編程中幾大特徵之一,所以還是有必要把類的繼承拎出來聊聊的。說到訪問權限,這個在OOP編程中也是不可或缺的。如果你接觸過其他OOP的語言,你應該對private, public, protected並不陌生。在Swift這麼面向對象的編程語言中,也有類似的概念,不過其具體表達的方式以及每種權限的作用域不同罷了。在Swift中的訪問權限有private, internal與public。他們的作用域與其他語言還是有些區別的,這個稍後會細細的道來。
今天的博客在類的內容中還是比較重要的,同時也是比較基礎的東西,當然很有必要好好的搞一下嘍。在介紹繼承和訪問權限時,在恰當的地方會類比一下Objc, 如果你沒有接觸過Objc, 那麼沒關係,你可以把類比的部分給忽略掉,這並不影響你對Swift相應內容的理解。好~開始今天博客的內容。
一. 類的繼承
其實繼承理解起來還是蠻簡單的,說白了就是子承父業。子類可以繼承父類的一些東西,在繼承之時,父類可以選擇一些東西留給子類,同時也可以保留一些東西作爲私有(private)物品。同樣,子類也可以選擇一些東西進行繼承,如果對繼承的東西不太滿意,子類就可以對繼承過來的東西進行重新改造(override)以滿足自己的需求。如果要定義抽象類,只需把該類的構造器定義爲私有即可。下方將會給出類的繼承的一些示例,通過這些事例來認識一下Swift中的繼承。
1. 父類的創建
這裏我們創建一個名爲Father的父類,他類可以繼承Father類。在Father類中有兩個初始值爲空串的屬性變量,並且有一個含有默認值參數的構造器,還有一個是輸出變量值的displayAllName()的方法。類中的代碼比較簡單,具體如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import Foundation class Father { var surname: String = "" var name:String = "" init(surname:String = "" , name:String = "" ) { self.surname = surname self.name = name } func displayAllName() { print( "我叫\(self.surname)\(self.name)" ) } } |
如果要定義抽象類,只需把上面的構造器進行一個修改即可。抽象類即爲專門用來做其他類的父類的類,抽象類不能夠直接被實例化,所以把其構造器定義爲私有的就可以達到不能直接被實例化的目的。如果要把上述類修改成抽象類,那麼把上面的構造函數替換成下方私有的構造函數即可。
1
2
3
4
|
private init() { self.surname = "" self.name = "" } |
2.實現Father的子類Children
Children類繼承自Father類,並在Father類的基礎上做了相應的擴充。Children中的構造器調用了父類的構造器來對父類的一些屬性進行初始化,當然,你也可以直接使用self來訪問父類的非私有屬性進行初始化,因爲Children是繼承自Father的,所以Father中非私有的東西都是視爲己有的所以可以使用self來訪問父類非私有的東西。子類持有了父類的非私有的東西,同時還可以增加屬於自己的東西,子類肯定是要在父類的基礎上在添加一些屬於自己特有的東西。Children添加了父類中沒有的job和disPlayMyJob的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Children: Father { var job:String = "" init(surname:String = "" , name:String = "" , job:String = "" ) { super .init(surname: surname, name: name) self.job = job } func displayMyJob() { print( "我的工作是\(self.job)" ) } } |
3.Children類的實例化
Chidren就是個類,其使用方式沒有什麼特別之處,就是調用構造器來進行類的實例化。實例化後,就可以調用類的非私有的屬性和方法了,具體代碼如下:
1
2
3
|
let children = Children(surname: "li" , name: "zelu" , job: "Coder" ) children.displayAllName() children.displayMyJob() |
4.防止類的子類化
抽象類的使命是專門用來繼承的,而有些類是不想讓其他類進行繼承的(丁克家族)。舉個例子,有些小夫妻呢,就不想要孩子,那麼怎麼辦呢?在Swift中也是有final關鍵字的,被final關鍵字所修飾的類是不能用來繼承的。我們可以把Father類定義成final類型,並觀察Children發生的變化。下方是修改後Father類的代碼:
1
2
3
4
|
final class Father { …………………… …………………… } |
Father添加上final關鍵字修飾後如果Children還對其進行繼承那麼就會報下面的錯誤,如下所示:
二、訪問權限
Swift中的訪問權限與其他面向對象編程語言有所不同,雖然Swift中的訪問權限也分爲3個等級,但是每個等級所能訪問的區域與其他編程語言相比還是有些區別的。在Swift的訪問權限包括public, private, internal三種訪問級別。下面將要對這三個級別一一進行介紹。
-
public: 公有訪問權限,類或者類的公有屬性或者公有方法可以從文件或者模塊的任何地方進行訪問。那麼什麼樣才能成爲一個模塊呢?一個App就是一個模塊,一個第三方API, 第三等方框架等都是一個完整的模塊,這些模塊如果要對外留有訪問的屬性或者方法,就應該使用public的訪問權限。
-
private: 私有訪問權限,被private修飾的類或者類的屬性或方法可以在同一個物理文件中訪問。如果超出該物理文件,那麼有着private訪問權限的屬性和方法就不能被訪問。
-
internal: 顧名思義,internal是內部的意思,即有着internal訪問權限的屬性和方法說明在模塊內部可以訪問,超出模塊內部就不可被訪問了。在Swift中默認就是internal的訪問權限。
關於訪問權限的實例就不過贅述了,理解起來還算是簡單的,今天的博客就先到這兒,接下來回繼續更新關於Swift相關的博客。如有錯誤還望批評指正。