Ch16. 協定.

Slides:



Advertisements
Similar presentations
第五章 类的继承和派生 Inheritance/extends/derive. 教学目标 理解继承的概念和作用 派生类的定义 理解访问修饰符 protected 方法的重写 继承下的构造函数的使用 继承下的 finalize 方法的使用 理解超类和子类的关系.
Advertisements

第3-2章 类与 对象 Java类的特性 教学内容: 类的私有成员与公共成员 方法的重载 构造方法 实例成员与静态成员 重点: 重载 难点:
单元二:面向对象程序设计 任务二:借书卡程序设计.
第三讲 面向对象(上).
JAVA 编 程 技 术 主编 贾振华 2010年1月.
阅卷归来话反思 及备考.
第14章 預存程序 14-1 預存程序的基礎 14-2 建立與執行預存程序 14-3 預存程序的參數傳遞 14-4 預存程序的傳回值
第7章 C#函數與.NET Framework類別函數庫
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
教育研究成果的生成与呈现 曾继耘 北京师范大学 博士 山东师范大学 教授.
新技术及其教学应用 虚拟现实技术 1.虚拟现实技术概述
元培科技大學 國泰人壽 為貴校創造 千萬福利金 員工福利專案 Department / Author:國泰人壽 / 黃國華 首頁:
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
第一章 面向对象程序设计.
第九讲 类与对象 (I)面向对象基础.
Google App Engine Google 應用服務引擎.
類別與物件 Class & Object.
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
第八章 类和对象.
1 Department of Computing.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
程設一.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
程式設計 博碩文化出版發行.
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
第3章 變數、資料型別與運算子.
Classes Lecturer: 曾學文.
Java 程式設計 講師:FrankLin.
JAVA程序设计 第5章 深入理解JAVA语言----补充.
Ch10 類別與物件-方法 Java程式設計(2).
Java软件设计基础 5. 继承与多态.
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
C++ 與 物件導向 程式設計概念簡介 魏天君 2018/12/3.
第9章 類別圖與物件圖 9-1 類別圖與物件圖的基礎 9-2 類別圖的符號 9-3 類別關係 9-4 物件圖 9-5 繪製類別圖與物件圖
Java程序设计 第9章 继承和多态.
辅导课程十三.
類別的繼承 Vehicle Car.
第3章 變數、資料型別與運算子 3-1 變數與資料型別的基礎 3-2 變數的命名與宣告 3-3 資料型別 3-4 運算式與運算子
复习 JavaScript && ES6 专题 (1) 2017/3/10 – Payne
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
變數命名 保留字(Reserved Word)
高级数据库系统作业答疑 ——面向对象
C语言 程序设计基础与试验 刘新国、2012年秋.
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
Php class 組員: 賴羿陵 林昱廷 莊正暉 張雅晴
$10 可空类型.
類別與物件 I (Classes and Objects I)
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
透過YouTuBe API取得資料 建國科技大學 資管系 饒瑞佶 2018/1 V1.
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
CH10. 屬性與方法.
Ch15. 型態轉換與延展.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
Ch02.變數、常數以及資料型態.
Object-Oriented Programming in C++ 第二章 类和对象
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
本节内容 Lua基本语法.
第11章 物件互動行為塑模.
第六章 类属B树索引技术 对基于树的索引方法给出一种通用算法。该算法是建立在类属B树的概念之上开发的。它将类型系统开放,使系统能支持用户自定义的数据类型、函数和某些特殊的查询谓词的集合。并且,将新的数据类型、函数、查询谓词等登记到数据库管理系统中,
第二章 Java基本语法 讲师:复凡.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
Ch07. 函式.
Go 语言编程 —— 平台研发部 吴植民.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
第4讲 类和对象、异常处理 ggao.
Ch06. 聚集型態.
第6章 继承和多态 伍孝金
Presentation transcript:

Ch16. 協定

16.1 屬性的協定 屬性的協定大都宣告為變數的屬性,所以前面會有var關鍵字。型 態宣告後以{get set}分別表示取得和設定之屬性。

範例程式 // property requirement protocol EnglishName { var name: String {get set} } struct Person: EnglishName { var name: String var someone = Person(name: "Bright") print(someone.name) someone.name = "Linda"

輸出結果 Bright Linda

16.2 方法的協定 方法的協定只是一個方法的雛型或稱藍圖,當某一類別、結構或 列舉採納了此方法的協定後,必須加以實作此雛型的主體。

範例程式 protocol Area { mutating func getArea(r: Double) -> Double } // struct not a class struct Circle: Area { var radius = 0.0 mutating func getArea(r: Double) -> Double { radius = r return radius * radius * 3.14159 // circleObject must be a var var circleObject = Circle() print("圓形面積: \(circleObject.getArea(r: 10))")

輸出結果 圓形面積: 314.159

16.3 當做型態的協定 協定也可以當做變數的型態。

範例程式part1 // protocol as type protocol Area { func getArea(r: Double) ->Double } class Circle: Area { var radius = 0.0 func getArea(r: Double) -> Double { radius = r return radius * radius * 3.14159 class Cylinder { var height: Int var calculateVolume: Area init(height: Int, calculateVolume: Area) { self.height = height self.calculateVolume = calculateVolume func volume() -> Double { return calculateVolume.getArea(r: 10.0) * Double(height)

範例程式part2 let cylinderObject = Cylinder(height: 10, calculateVolume: Circle()) print(cylinderObject.volume())

輸出結果 3141.59

16.4 以延展加入協定 也可以將協定以延展的方式加入於類別或結構。

範例程式part1 // extension protocol Description { func information() -> String } protocol Area { func getArea(r: Double) -> Double class Circle: Area { var radius = 0.0 func getArea(r: Double) -> Double { radius = r return radius * radius * 3.14159 class Cylinder { var height: Int var calculateVolume: Area init(height: Int, calculateVolume: Area) { self.height = height self.calculateVolume = calculateVolume func volume() -> Double { return calculateVolume.getArea(r: 10.0) * Double(height)

範例程式part2 extension Cylinder: Description { func information() -> String { return "Voluem of Cylinder:" } let cylinderObject2 = Cylinder(height: 10, calculateVolume: Circle()) print(cylinderObject2.information()) print(cylinderObject2.volume())

輸出結果 Voluem of Cylinder: 3141.59

16.5 協定的繼承 協定也可以繼承。以下程式有一協定Description,如下所示: protocol Description { 16.5 協定的繼承 協定也可以繼承。以下程式有一協定Description,如下所示: protocol Description { func information() -> String } 之後又定義協定FullyDescription,其繼承協定Description,此稱為 協定繼承 (protocol inheritance) 如下所示: protocol FullyDescription: Description { func fullyinformation() -> String

範例程式part1 protocol Description { func information() -> String } class Cylinder { var height: Int init(height: Int) { self.height = height extension Cylinder: Description { func information() -> String { return "Voluem of Cylinder:" protocol FullyDescription: Description { func fullyinformation() -> String extension Cylinder: FullyDescription { func fullyinformation() -> String { var output = information() output += " A" return output

範例程式part2 let cylinderObject3 = Cylinder(height: 20) print(cylinderObject3.information()) print(cylinderObject3.fullyinformation())

輸出結果 Voluem of Cylinder: Voluem of Cylinder: A

16.6 協定的組合 若一型態要遵從多個協定時,就得利用協定組合 (protocol composition)。 16.6 協定的組合 若一型態要遵從多個協定時,就得利用協定組合 (protocol composition)。 遵從多個協定的格式為name: Someprotocol, Anotherprotocol,將 多個協定以逗號隔開。 協定的組合,則以&串連之。

範例程式 // protocol composition protocol Named { var name: String {set get} } protocol Department { var department: String {set get} struct Person: Named, Department { var name: String var department: String func status(who nameDepartment: Named & Department) { print("\(nameDepartment.name) majors in \(nameDepartment.department)") let whoAmI = Person(name: "Jennifer", department: "foreign language") status(who: whoAmI) print()

輸出結果 Jennifer majors in foreign language

16.7 檢查是否有遵從協定 如何檢查實例是否遵從協定,有三種運算子可加以使用。 16.7 檢查是否有遵從協定 如何檢查實例是否遵從協定,有三種運算子可加以使用。 is運算子判斷實例是否遵從協定,若是,則回傳true,否則回傳 false。 as? 運算子若遵從協定,則回傳選項值,否則回傳nil。 as運算子和as? 相似,但若沒遵從協定時,在執行時期將會產生 錯誤。

範例程式part1 // checking for protocol conformance protocol GetArea { var area: Double {get} } class Circle: GetArea { var radius: Double init(radius: Double) { self.radius = radius var area: Double { return radius * radius * 3.14159 class Rectangle: GetArea { var width: Double var height: Double init(width: Double, height: Double) { self.width = width self.height = height return width * height

範例程式part2 class What { var message: String init(message: String) { self.message = message } let objects: [AnyObject] = [ Circle(radius: 20.0), Rectangle(width:10, height: 20), What(message: "I Want to buy iPhone 6") ] for object in objects{ print(object is GetArea) for object in objects { if let objectArea = object as? GetArea { print("面積為: \(objectArea.area)") } else { print("此物件無計算面積方法")

輸出結果 true false 面積為: 1256.636 面積為: 200.0 此物件無計算面積方法

16.8 JSON的編碼和解碼 Swift 4簡化了整個JSON壓縮和解壓縮的過程。 只需要將自定的類別,繼承Codable協定 ,之後利用encode和 decode方法,就可輕易的完成。

範例程式 class Book: Codable { let title: String let author: String let publishing: String init(title: String, author: String, publishing: String) { self.title = title self.author = author self.publishing = publishing } let book = Book(title: "學會Swift 4的24堂課", author: "蔡明志", publishing: "碁峯資訊股份有限公司") let encoder = JSONEncoder() let gotop = try encoder.encode(book) let string = String(data: gotop, encoding: .utf8) let decoder = JSONDecoder() let article = try decoder.decode(Book.self, from: gotop) let output = "\(article.title) \(article.author) \(article.publishing)"

輸出結果 學會Swift 4的24堂課 蔡明志 碁峯資訊股份有限公司