教育部改善師資經費補助 正修科技大學 102 年度教師成果報告 ****************************** 跨平台 APP 開發從零開始 ****************************** 團體 個人 單 位 : 電子工程系 單位主管 : 陳振聲 ( 簽章 ) 職 姓 稱 : 副教授 名 : 林宜賢 執行期間 :102 年 8 月 26 日至 8 月 28 日 教評會審查期間 : 學年度第次 ( 年月日 ) - 1 -
研習主題 : 透過研習, 讓參與的老師了解 MCSD 認證的學習指標與內容, 做為日後將考試認證與教學課程結合的參考, 以追求更好的學習成果及國際認證成績 為能實務與證照整合及運用, 針對第一個考科 70-483, 設計一個三日實戰課程, 目標在課程內容帶學員完成一支觀光美食 APP, 並整合 GOOGLE MAP 及 FACEBOOK 可以按贊等社群雲端功能, 以符合現今 APP 必備的運用狀況 研習日期 :2013/08/26~2013/08/28 研習地點 : 樹德科技大學圖資大樓 8F L0836 教室 課程內容 : 研習內容包含 : 類別的定義 :C# 中使用 class{ 來定義一個類別, 要特別注意的是這個類別的定義哪裡都可以放, 就是不能放在方法 ( 函式 ) 中 ( 當然包含事件 ), 也不能放在 namespace{ 外 類別定義一定是全域性的宣告 C# 中使用 class{ 來定義一個類別, 要特別注意的是這個類別的定義哪裡都可以放, 就是不能放在方法 ( 函式 ) 中 ( 當然包含事件 ), 也不能放在 namespace{ 外 類別定義一定是全域性的宣告 - 2 -
命名空間 : 命名空間 (Namespace) 可以有效地將眾多物件根據它的功用有效地分類, 也可以避免不同廠商採用相同名稱的困擾 假設要在同一個 C# 程式檔 (*.cs) 中宣告兩個名稱一模一樣的類別,C# 編譯器一定會因為名稱重覆而出現錯誤, 此時可利用命名空間來解決這個問題 namespace{ 敘述只能放在檔案層級, 也就是說不可以放在方法 ( 函式 ) 或 class 宣告中, 不過 namespace 中還是可以有其它 " 子命名空間 " 一般來說專案名稱即是命名空間的名稱 定義命名空間 : 如下定義 IBM 命名空間, 內含 Notebook 類別 namespace IBM { // 定義 IBM 命名空間 class Notebook { 如下定義 Apple 命名空間, 內含 Notebook 類別 namespace Apple { // 定義 Apple 命名空間 class Notebook { 使用命名空間中類別物件 : 使用 IBM 命名空間的 Notebook 類別物 件, 寫法如下 : IBM.Notebook A = new IBM.Notebook(); 使用 Apple 命名空間的 Notebook 類別物件, 寫法如下 : Apple.Notebook B = new Apple.Notebook(); 如何建立屬性 : 建立屬性的方式大致上可以分成下面兩種方法 : - 3 -
直接在類別中宣告 public 欄位變數 使用 get 及 set 存取子 使用 public 欄位變數當屬性 : class Member { // 定義 Member 會員類別 public string Name; public int Salary; //Name 姓名欄位 //Salary 薪水欄位 // 主程式 Member peter = new Member(); // 建立 peter 物件 peter.name = " 彼得 "; peter.salary = 30000; 使用 public 欄位變數當屬性的缺點 : 直接在 class 中宣告 public 變數雖然是建立屬性最快速的方式, 但是對於這類型屬性的存取並無法做任何的額外控制, 如下可將 Salary 薪水設為負數, 或設為超過 10000000: // 主程式 Member peter = new Member(); // 建立 peter 物件 peter.name = " 彼得 "; peter.salary = -30000; // 不合理薪水 peter.salary = 10000000; // 不合理薪水 - 4 -
使用方法控制屬性 : 做法同 Java 設計一個 GetXXX 方法用來取得欄位資料, 設計一個 SetXXX 方法用來設定欄位資料並限制其範圍 使物件達到封裝的特性 設定薪水屬性 20000~40000 其寫法如下 class Member { // 定義 Member 會員類別 public string Name; //Name 姓名欄位 private int m_salary; //m_salary 薪水欄位 public void SetSalary(int value) // 設定薪水屬性方法 { if (value <= 20000) // 薪水最少 20000 m_salary = 20000; else if (value >= 40000) // 薪水最多 40000 m_salary = 40000; else m_salary = value; public int GetSalary(){ return m_salary; // 取得薪水屬性方法 // 主程式 Member peter = new Member(); // 建立 peter 物件 peter.setsalary(-30000) ; // 結果 peter.getsalary() 會得到 20000 使用 get 及 set 存取子建立屬性 : - 5 -
使屬性可讀性高 使物件屬性與控制項屬性可進行資料繫結 C# 提供 get 及 set 存取子敘述來定義屬性 您可以使用 get 存取子來取得物件的屬性值和使用 set 存取子來設定物件的屬性值 設定薪水屬性 20000~40000 其寫法如下: class Member { // 定義 Member 員工類別 public string Name; //Name 姓名欄位 private int m_salary; //m_salary 薪水欄位 public int Salary // 薪水屬性 { get{ return m_salary; set { if (value <= 20000) // 薪水最少 20000 m_salary = 20000; else if (value >= 40000) // 薪水最多 40000 else m_salary = 40000; m_salary = value; // 主程式 Member peter = new Member(); // 建立 peter 物件 peter.salary=-30000 ; // 結果 peter.salary 會得到 20000-6 -
唯讀屬性與唯寫屬性 : 唯讀屬性即是在屬性的定義中只能出現 get { 區段, 絕對不能加入 set { 區段 唯寫屬性即是在屬性的定義中設定 set { 區段, 不能加入 get { 區段 唯讀屬性 : class Member { // 定義 Member 員工類別 public int Salary // 薪水屬性 { get { // 只有 get 存取子 唯寫屬性 : return m_salary; class Member { // 定義 Member 員工類別 public int Salary // 薪水屬性 { set { // 只有 set 存取子 if (value <= 20000) // 薪水最少 20000-7 -
m_salary = 20000; else if (value >= 40000) // 薪水最多 40000 自動屬性實作 : else m_salary = 40000; m_salary = value; 在類別內使用 get 及 set 存取子來定義屬性最大的優點即是可以隱藏實作以及驗證程式碼, 以達物件導向資料封裝 使用 get 及 set 存取子來定義類別屬性, 該屬性即可與控制項屬性進行資料繫結 若使用 public 公用變數當做類別屬性, 即無法達到資料封裝, 且該屬性也不能和控制項屬性進行資料繫結, 因此建議將 public 公用變數改使用 public 公用屬性來表示 由 Visual C# 2008 版本開始提供 自動屬性實作 讓屬性的定義更為明確 使用 get 及 set 存取子來定義屬性即不需要重複宣告存放屬性的私有變數, 這些存放屬性的私有變數會由編譯器自動建立 將欄位變數改成 自動屬性實作 如下 : class Student // 定義學生類別 { - 8 -
public string ID{ get; set; // 定義 ID 學號屬性 public string Name{ get; set; // 定義 Name 姓名屬性 建立方法 : 物件的方法 ( 也有人稱之為成員函式 Member Function) 其實就是定義在類別中的函式, 而方法的參數也不過就是函式的參數罷了 物件的方法也可以多載 在物件方法 ( 即類別的方法內 ) 中要存取本身的屬性或欄位, 必須使用 this 關鍵字,this 表示物件自己本身 建構函式 : 每個類別都有建構函式簡稱 建構式 (Constructor Function), 它是擁有與類別相同名稱的方法 建立物件時, 會呼叫建構函式 建構函式通常用來設定類別中所定義變數的初值 若是數值資料型別的初始值設為零 布林資料型別的初始值要設為 false, 或參考型別的初始值要設為 null, 則建構函式就不一定會設定初始值, 因為這些資料型別都會自動進行初始化 建構函式也可以多載 - 9 -
不帶任何參數的建構函式稱為 預設建構函式 (Default Constructor) 建構式是在建立物件時用來做物件初始化工作 例如 : 開啟資料檔 案 配置記憶體, 當程式執行到 Member peter = new Member(); 時, 由於加上了 new 敘述, 因此會去執行物件中的建構式即呼叫 Member() 建構函式 C# 允許你在定義類別中擁有一個以上的建構式, 以應因建立物件 時有不同初始化的方式, 建構式的名稱一定要和類別名稱相同, 編 譯器會根據所傳入參數個數及資料型別來呼叫所對應的建構式 若定義類別中未加入建構式, 當程式建立物件時, 編譯器會自動提 供一個不做任何事的預設建構式 (Default Constructor) 定義一個 Student 類別擁有兩個建構式, 一個傳入一個參數, 一個 傳入兩個參數來做建立物件初始化的工作 : class Student{ private int _Height, _Weight; // Student 類別的建構式, 須設定一個引數 public Student(int w){ _Weight = w; _Height = 160; // Student 類別的建構式, 須設定兩個引數 public Student(int w, int h){ _Weight = w; _Height = h; - 10 -
// 主程式 Student David = new Student(56); Student Mary = new Student(48, 150); 定義類別時若沒有撰寫建構式時,C# 會自動產生一個預設建構式 (Default Constructor), 這表示物件產生時, 所有的資料成員都不必 進行初始化的動作 若有定義建構式時, 預設建構式會自動消失, 此時若想要使用不帶 參數的建構函式, 則必須定義一個空的不在參數的建構函式 解構函式 : 建構式中可以用來做一些物件的初始化動作, 而當物件消滅時, 就 會執行物件的 解構式 (Destructor) 在解構式中可做一些物件結束的動作, 譬如 : 關閉資料檔案 釋放 所配置的記憶體 等工作 類別中允許建立參數多樣化的建構式, 但是解構式只能有一個, 建 構式的名稱一定要和類別名稱相同, 可以根據所傳入的引數來呼叫 不同的建構式, 而解構式名稱則是在類別名稱之前加上 ~ 例如 : 上面例 Student 類別的解構式名稱即為 ~Student 建立物件時使用建構式與解構式時應注意下列事項 : 1. 若類別中未定義建構式, 會自動提供一個不做任何事的預設 建構式 (Default constructor) - 11 -
2. 建構式的名稱必須與類別名稱同名 3. 建構式也可以多載, 其做法和多載方法一樣, 是使用不同的 引數串列的個數和引數串列的資料型別來加以區隔建構式 4. 建構式和解構式沒有傳回型別, 即使是 void 也不需要 5. 解構式的名稱必須和類別一樣, 且解構式名稱之前要加上 ~ 符號 6. 解構式是無接受參數的方法, 且只能有一個, 因此解構式無 法多載 7. 解構式無法直接呼叫, 只有在物件被破壞時才會執行 class Member{ // 主程式 // 建構函式, 必須帶入兩個參數 Member (string _name, int _salary){ // 解構函式, 當物件變數為 null // 且執行記憶體回收機制才會觸發 ~Member() { Member peter = new Member(" 彼得 ", 50000); peter = null; GC.Collect(); // 強制執行記憶體回收機制, 此時才會執行解構式 - 12 -
物件初始設定式 : 當使用 new 建立物件時會呼叫指定的建構函式, 假若欲設定初始化物件的屬性很多, 那就要定義多載建構函式 譬如 : 會員類別擁 Id 帳號 Pwd 密碼 Name 姓名 Tel 電話 Address 住址等五個屬性, 若希望建立會員物件同時可以初始化會員物件 0~5 個屬性值, 此時最少就要定義 5 個 Member 建構函式, 如下 : public class Member { // 定義 Member 類別 public string Id { set; get; public string Pwd { set; get; public string Name { set; get; public string Tel { set; get; public string Address { set; get; public Member (){ // 建構函式 #1 public Member (string vid){id=vid ; // 建構函式 #2 public Member (string vid, string vpwd){ // 建構函式 #3 Id=vId ; Pwd=vPwd ;... public Member (string vid, string vpwd, // 建構函式 #5 string vname, string vtel, int vaddress){ Id=vId ; Pwd=vPwd; Name=vName ; Tel=vTel ; Address=vAddress; 上例透過類別建構函式來初始化物件的屬性值很麻煩, 在 C# 提供 物件初始設定式 可用來初始化物件的欄位或屬性值, 使用 物 - 13 -
件初始設定式 並不需要明確呼叫建構函式即可進行物件屬性或欄位初始化的動作 如下寫法使用物件初始設定式來初始化 Member 物件的 Id 帳號, Pwd 密碼, Name 姓名, Tel 電話, Address 住址的屬性值, 其寫法比建構函式的方式更加簡單 public class Member { // 定義 Member 類別 public string Id { set; get; public string Pwd { set; get; public string Name { set; get; public string Tel { set; get; public string Address { set; get; // 主程式 //Jasper 物件設定帳號為 "Jasper" Member Jasper = new Member {Id="Jasper"; //Anita 物件設定帳號為 "Anita", 密碼為 "123", 姓名為 " 愛尼塔 " Member Anita = new Member {Id="Anita", Pwd="123", Name=" 愛尼塔 "; //Aliya 物件初始化帳號, 密碼, 姓名, 住址, 電話 Member Aliya = new Member { Id="Aliya", Pwd="456", Name=" 愛麗雅 ", Address=" 台北市忠山路 1 號 ", Tel="02-22551133"; 建立事件 : 事件 (Event) 是在宣告物件時才由程式設計師針對自己的 - 14 -
需要來撰寫事件 例如 button1 物件原本就有 Move 方法, 因為 Move 方法是在 Button 類別中早就事先定義好的, 而 button1_click 事件則是必須自行在類別之外 ( 不是在類別中定義 ) 撰寫相關的程式碼, 也就是說在類別中僅僅定義事件的名稱與參數, 至於事件 ( 事件函式 ) 則是在物件使用時才加以定義的 建立事件五個步驟 : 一. 建立 delegate 委派型別二. 建立 event 敘述宣告事件三. 如何觸動事件四. 如何定義事件五. 指定物件發生事件所要處理的方法 類型繼承 : 物件導向程式設計中的繼承就類似真實世界的遺傳一樣, 例如 : 兒子會遺傳爸爸或媽媽的特色 ( 屬性或方法 ), 且兒子會再擁有自己新的特色 透過繼承的機制可以讓新的類別可以延伸出更強的功能, 通常我們將被繼承的類別稱為基底類別 (Base class) 父類別(Parent class) 或超類別 (Super class), 而繼承的類別稱為衍生類別 (Derived - 15 -
class) 子類別(Child class) 或次類別 (Sub class) 當子類別繼承自父類別後, 子類別擁有父類別所有的成員 ( 屬性 方法 欄位 ) C# 繼承語法如下 : class 子類別 : 父類別 // 子類別繼承自父類別 { - 16 -