您好,登錄后才能下訂單哦!
如果類的所有方法都是抽象的,在Swift和Object-C中稱為協議,在Java語言中稱為接口,在C++中稱為純虛類;只有方法的定義沒有方法的具體實現,所在的類叫抽象類
協議不能被實例化
Swift和Object-C中實現抽象類的過程稱為遵守協議
一、聲明和遵守協議
類、結構體和枚舉類型可以聲明與遵守某個協議,并提供該協議所需要的屬性和方法
協議定義的語法如下:
protocol 協議名 {
//內容
}
在聲明遵守協議時,格式如下:
類型 類型名:協議1,協議2 {
//遵守協議內容
}
類型包括類、結構體和枚舉,冒號后面是遵守的協議,如果有多個協議,協議之間用逗號隔開
協議可以要求其遵守者提供實例屬性,靜態屬性,實例方法和靜態方法的實現,
二、協議方法
協議可以要求其遵守者實現某些指定方法,包括實例方法和靜態方法,這些方法在協議中被定義,協議方法和普通方法類似,但不支持邊長參數和默認值參數,也不需要大括號和方法體
1、實例協議方法
protocol Figure { func onDraw() } class Rectangle:Figure { func onDraw(){ println("繪制矩形") } } class Circle:Figure { func onDraw(){ println("繪制圓形") } }
2、靜態協議方法
在協議中定義靜態方法與在類中定義靜態方法一樣,方法前需要添加class關鍵字,在遵守該協議的時候,遵守者靜態方法前加class或者static,與遵守者類型有有關系,如果是類,關鍵字就是class,如果是結構體或枚舉,關鍵字就是static.
protocol Account { class func interestBy(amount:Double)->Double } class ClassImp:Account { class func interestBy(amount:Double)->Double { return 0.668 * amount } } class StructImp:Account { static func interestBy(){ return 0.668 * amount } }
3、變異方法
在結構體和枚舉類型中可以定義變異方法,而在類中沒有這種方法,原因是結構體和枚舉中的屬性是不可修改,通過定義變異方法,可以修改這些屬性,而類是引用類型,不需要變種方法就可以修改自己的屬性;
在協議定義變種方法時,方法前要加上mutating關鍵字,類、結構體和枚舉都可以實現變異方法,類實現變異方法時,前面不需要加mutating關鍵字,結構體和枚舉在實現變異方法時,前面需要加mutating關鍵字
protocol Editable { mutating func edit() } class ClassImp:Editable{ var name = "ClassImp" func edit(){ println("編輯ClassImp...") self.name = "編輯ClassImp" } } struct StructImp:Editable { var name = "StructImp" mutating func edit(){ println("編輯StructImp") self.name = "編輯StructImp" } }
struct Enum:Editable { case Monday case Tuesday case Wednesday case Thursday case Friday mutating func edit(){ self = .Friday } }
4、實例協議屬性
協議可以要求其遵守者實現某些指定屬性,包括實例屬性和靜態屬性,在具體定義的時候,每一種屬性都可以有只讀和讀寫之分
對于遵守者而言,實例屬性時市場靈活的,無論是存儲屬性還是計算屬性,只要能通過協議屬性的要求,就可以通過編譯,甚至是協議中定義了只讀屬性,而遵守者提供了對該屬性的讀寫,這也是被允許的,因為遵守者通過了協議的只讀屬性要求,協議只規定了必須要做的事情,但沒有規定不能做的事情;
protocol Person { var firstName:String{get set} var lastName:String {get set} var fullName:String{get} } class Employee:Person { var no:Int = 0 var job:String? var salary:Double = 0 var firstName:String = "Tony" var lastName:String = "zhang" var fullName:String { get { return "\(firstName)\(lastName))" } set(newFullName){ var name = newFullName.componentsSeperatedByString(".") self.firstName=name[0] self.lastName=name[1] } } }
三、協議屬性
在協議中定義靜態屬性與在協議中定義靜態屬性類型,屬性前面要加class關鍵字還是static,與遵守者類型有關系,如果是類,關鍵字是class,如果是結構體和枚舉,關鍵字是static
protocol Account { class var interestRate:Double {get} class func interestBy(amount:Double)->Double } class ClassImp:Account{ class var interestRate:Double { return 0.668 } class func interestBy(amount:Double)->Double{ return ClassImp.interestRate * amount } } struct StructImp:Account { static var interestRate:Double = 0.668 static func interestBy(amount:Double)->Double { return StructImp.interestRate * amount } }
四、把協議作為類型使用
雖然協議沒有具體的實現代碼,不能被實例化,但它的存在是為了規范其遵守者而設計的,它是面向接口編程必不可少的機制,面向接口編程的系統的定義與實現應該分離,協議作為數據類型暴露給使用者,使其不用關心具體的實現細節,從而提供系統的擴展性和復用性;
在Swift中,協議作為數據類型使用,它可以出現在任意允許數據類型出現的地方:
protocol Person { var firstName:String{get set} var lastName:String {get set} var fullName:String{get} fun description()->String } class Student:Person { var school:String var firstName:String var lastName:String var fullName:String { return self.firstName + self.lastName } func description()->String { return self.firstName+self.lastName+self.school } init(firstName:String,lastName:String,school:String){ self.firstName = firstName self.lastName = lastName self.schooll = school } }
五、協議的繼承
一個協議繼承就像是類繼承一樣:
protocol Person { var firstName:String{get set} var lastName:String {get set} var fullName:String{get} fun description()->String }
protocol Student:Person { var school:String } class Graduate:Student{ }
六、協議的合成
多個協議可以臨時合并成一個整體,作為一個類型使用,首先要有一個類型在聲明時遵守多個協議
protocol Ship { var displacement:Double {get set} } protocol Weapon { var gunNumber{get set} } class WarShip:Ship,Weapon{ var displacement = 100000.00 var gunNumber = 10 } func showWarResource(resource:protocol<Ship,Weapon>){ println("\(resource.displacement):\(resource.gunNumber)") } let ship = WarShip() showWarResource(ship)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。