一、類和對象
假設我開了一家烤魚店,每當客人來點餐時,我就會用筆和紙記錄這筆訂單,並計算出每單的價格。以下是記錄的訂單:
單號:00001
種類:清江魚
口味:香辣
配菜:豆腐
價格:140元
------------
單號:00002
種類:江團
口味:蒜香
配菜:海帶
價格:180元
上面所有的內容都需要手寫,當客人多的時候很浪費時間,於是我就去打印店按照以下模板打印點餐單(即紙質訂單):
單號:
種類:
口味:
配菜:
價格:
這樣每位客人點餐時,我就只需要寫下客人點餐的內容即可。
在上面的例子中,我記錄的每一筆訂單都可以看作一個對象,這每一筆訂單都有對應的值使之與其他訂單不同,但是所有訂單都具有相同的屬性和行為,通過抽象出這些屬性和行為得到點餐單,所以點餐單可以看作訂單的類,反之對點餐單填充不同的值,可以得到不同的訂單,也就是不同的對象。通過對上面的理解給類和對象下定義,類是具有相同狀態和行為的一類事物,對象是一個客觀存在且獨一無二的個體。類和對象的關系:類是對對象的抽象,對象是對類的填充或實例化。
類的基本結構:訪問修飾符 class 類名{ },其中大括號里可以是類型成員(常量、字段、屬性、構造函數、方法、事件等)中的一種或多種構成。
對象的基本結構是類的實例化:類名 變量名 = new 類名();,其中變量名也叫對象。
下面我們根據上面的例子設計對應的類,並實現相應的對象。(為使代碼簡單,訪問修飾符均用public)
1 /// <summary> 2 /// 擁有單號、種類、口味、配菜、價格和計算價格行為的訂單類 3 /// </summary> 4 public class Order 5 { 6 #region 字段 7 /// <summary> 8 /// 單號(單號為自增字段,無需賦值,自增代碼省略) 9 /// </summary> 10 public int orderNo; 11 12 /// <summary> 13 /// 種類 14 /// </summary> 15 public string type; 16 17 /// <summary> 18 /// 口味 19 /// </summary> 20 public string flavor; 21 22 /// <summary> 23 /// 配菜 24 /// </summary> 25 public string garnish; 26 27 /// <summary> 28 /// 價格 29 /// </summary> 30 public decimal price; 31 #endregion 32 33 #region 方法 34 /// <summary> 35 /// 計算價格 36 /// </summary> 37 /// <param name="type">魚的種類</param> 38 /// <param name="garnish">配菜種類</param> 39 public void CalculateThePrice(string type, string garnish) 40 { 41 //通過魚的種類和配菜種類計算價格,過程省略 42 } 43 #endregion 44 } 45 /// <summary> 46 /// 實現對象的類 47 /// </summary> 48 public class RealizeObject 49 { 50 #region 方法 51 /// <summary> 52 /// 實現 53 /// </summary> 54 public void Realize() 55 { 56 //清江魚香辣味加豆腐配菜需要140元的訂單對象 57 Order order = new Order(); 58 order.type = "清江魚"; 59 order.flavor = "香辣"; 60 order.garnish = "豆腐"; 61 order.price = 140;//直接賦予價格 62 order.CalculateThePrice("清江魚", "豆腐");//通過行為計算價格 63 64 //江團醬香味加海帶配菜需要180元的訂單對象 65 Order orderTwo = new Order(); 66 orderTwo.type = "江團"; 67 orderTwo.flavor = "醬香"; 68 orderTwo.garnish = "海帶"; 69 orderTwo.price = 180;//直接賦予價格 70 orderTwo.CalculateThePrice("江團", "海帶");//通過行為計算價格 71 } 72 #endregion 73 }
詳解類的實例化過程:Order order = new Order();等號前半部分定義一個類型為Order的變量order,這個變量的值為null;當加上等號后半部分時,才給order變量賦值,並且Order的構造函數會為order的所有字段賦默認值。用點餐單的例子講當沒有等號后半部分時,我想把一張白紙order用作點餐單,但我還沒有去打印,當加上等號后半部分后,order這張白紙被我打印成了點餐單,並且我可能在打印完后立馬填充對應的值。
二、類和對象相關語法
1、對象初始化語法:使用默認構造函數創建對象並設置對象數據值的簡寫形式。代碼如下:
1 public class Garnish { } 2 public class Order 3 { 4 /// <summary> 5 /// 種類 6 /// </summary> 7 public string Type { get; set; } 8 9 /// <summary> 10 /// 口味 11 /// </summary> 12 public string Flavor { get; set; } 13 14 /// <summary> 15 /// 配菜 16 /// </summary> 17 public string Garnish { get; set; } 18 19 /// <summary> 20 /// 價格 21 /// </summary> 22 public decimal Price { get; set; } 23 24 /// <summary> 25 /// 其他配菜 26 /// </summary> 27 public Garnish OtherGarnish { get; set; } 28 29 public Order() { } 30 31 public Order(string type, string flavor, string garnish) 32 { 33 Type = type; 34 Flavor = flavor; 35 Garnish = garnish; 36 } 37 } 38 public class RealizeObject 39 { 40 public void Realize() 41 { 42 //清江魚香辣味加豆腐配菜需要140元的訂單對象 43 //傳統方式如下: 44 Order order = new Order(); 45 order.Type = "清江魚"; 46 order.Flavor = "香辣"; 47 order.Garnish = "豆腐"; 48 order.Price = 140;//直接賦予價格 49 //對象初始化語法如下: 50 Order order = new Order//也可以加上(),顯式調用默認構造函數 51 { 52 Type = "清江魚", 53 Flavor = "香辣", 54 Garnish = "豆腐", 55 Price = 140 56 }; 57 58 //江團醬香味加海帶配菜需要180元的訂單對象 59 //傳統方式如下: 60 Order orderTwo = new Order("江團", "醬香", "海帶"); 61 orderTwo.Price = 180;//直接賦予價格 62 //調用自定義構造函數的對象初始化語法如下: 63 Order orderTwo = new Order("江團", "醬香", "海帶") 64 { 65 Price = 180 66 }; 67 68 //在Order類中包含其他類型的屬性時,對象初始化語法也可以嵌套使用 69 Order orderThree = new Order 70 { 71 OtherGarnish = new Garnish { } 72 }; 73 } 74 }
2、部分類型:當一個類的代碼過長時,可以通過partial關鍵字把這個類分割成兩個甚至更多(物理文件分割成多個,邏輯上還是一個),一般會把不變的部分和可變的部分分割開來。
1 /// <summary> 2 /// 不變的部分 3 /// </summary> 4 public partial class Order 5 { 6 //字段 7 8 //構造函數 9 } 10 /// <summary> 11 /// 可變的部分 12 /// </summary> 13 public partial class Order 14 { 15 //屬性 16 17 //方法 18 }
注:定義分部類的唯一要求是類型名稱必須相同,並且必須定義在相同的命名空間中。