在上一篇文章中,介紹了類如何封裝程序中的對象.而實際中,出了類可以封裝對象外,結構和枚舉也可 以封裝一些對象,本文將著重介紹結構和枚舉這兩個知識點的相關應用.
一. 結構(Structure)
什麼是結構(Structure)?在C#裡,Struct是一種值類型,通常用來封裝小型相關變量組,和類有很大的相 似度.同類一樣,它不但可以包含不同數據類型數據。還可以包含復合類型(數組,結構,DateTime等等) 除了以名字/值方式出現還可以有屬性和方法,所以說結構是一種強大的復合型數據。
1. 使用類封裝對象的屬性
以圖書來作為示例來分析,圖書包括圖書編號,圖書名稱,圖書作者以及出售價格等.我們平時所通常都 是使用類來封裝這些信息,如下:
1/**//// <summary>
2/// 圖書對象
3/// </summary>
4public class Books
5{
6 public int bookId;
7 public string bookName;
8 public string bookAuthor;
9 public double bookPrice;
10}
2. 使用結構封裝對象的屬性
其實出了使用類來封裝,我們還可以使用結構來封裝,實現如下:
1/**//// <summary>
2/// 使用結構封裝圖書信息
3/// </summary>
4public struct Book
5{
6 public int bookId;
7 public string bookName;
8 public string bookAuthor;
9 public double bookPrice;
10}
3. 結構可以定義構造方法
1/**//// <summary>
2/// 使用結構封裝圖書信息
3/// </summary>
4public struct Book
5{
6 /**//// <summary>
7 /// 可定義構造方法
8 /// </summary>
9 public Book()
10 {
11 //
12 }
13
14 public int bookId;
15 public string bookName;
16 public string bookAuthor;
17 public double bookPrice;
18}
4. 可以使用new進行初始化
1/**//// <summary>
2/// 使用結構封裝圖書信息
3/// </summary>
4public struct Book
5{
6 /**////// <summary>
7 ///// 可定義構造方法
8 ///// </summary>
9 //public Book()
10 //{
11 // //這裡需要注意,當結構中已有帶參數的構造方法時,則不能定義無參數的構造方法
12 //}
13
14 public Book(int id, string name, string author, double price)
15 {
16 bookId = id;
17 bookName = name;
18 bookAuthor = author;
19 bookPrice = price;
20 }
21 public int bookId;
22 public string bookName;
23 public string bookAuthor;
24 public double bookPrice;
25}
5. 結構可以實現接口
1/**//// <summary>
2/// 接口
3/// </summary>
4public interface IBook
5{
6 DataSet QueryAll();
7}
8
9/**//// <summary>
10/// 結構實現接口
11/// </summary>
12public struct BookComponent : IBook
13{
14 public DataSet QueryAll()
15 {
16 return null;
17 }
18}
6. 類和結構的區別
從上面可以看出,無論是使用類還是結構,都可以用來封裝對象的屬性.當然出了相同點外,兩者之間還 是有很大的不同,大體如下:
類型:類是引用類型,結構是值類型.
繼承:類可繼承,結構不能繼承.結構不能繼承其他的結構和類,或是被用作其他結構或類的基類.
構造方法與析夠函數:結構可以定義構造方法,但不能定義析夠函數.類既可以定義構造方法,也可定義 析夠函數.
對象創建:可以使用new進行初始化,或進行手工初始化.類和結構都可以.
結構與接口:結構可以實現一個或多個接口. 如上:public struct BookComponent:IBook { //....}.
多態: 結構與接口之間是支持多態的.如上面的結構實現接口為例,多態:IBook book = new BookComponent();
二. 枚舉(Enumeration)
什麼是枚舉(Enumeration)?枚舉可以理解為通過預定義列出所有值的標識符來定義一個有序集合,這些 值的次序和枚舉說明中的標識符的次序一致的. 通常用於定義一些不變的序列,如一年四個季節,一禮拜為 七天等等. 可以通過enum來定義(這裡主要是針對C#語言的實現,其實在JAVA語言裡也是通過enum來定 義).
1. 枚舉的定義形式
修飾符 enum 枚舉名
{
標識符1,
標識符2,
..........,
標識符n
}
如下則為一個完整的枚舉定義:
1/**//// <summary>
2/// 技術方向
3/// </summary>
4public enum TechnologyDirection
5{
6 CPlusPlus程序員,
7 Java程序員,
8 DotNet程序員,
9 架構設計師,
10 開發組長,
11 需求分析師
12}
2. 另類枚舉定義(可以初始化值)
1==============以下為第一種定義方法==============
2/**//// <summary>
3/// 季節
4/// </summary>
5public enum Season
6{
7 SPRING, //春天
8 SUMMER, //夏天
9 AUTUMN, //秋天
10 WINTER //冬天
11}
12==============以下為第二種定義方法==============
13/**//// <summary>
14/// 季節
15/// </summary>
16public enum SeasonTwo
17{
18 SPRING = 0, //春天
19 SUMMER = 1, //夏天
20 AUTUMN = 2, //秋天
21 WINTER = 3 //冬天
22}
23=================TEST===================
24class Program
25{
26 static void Main(string[] args)
27 {
28 //以上兩種定義方法效果都一樣
29 Console.WriteLine(Season.AUTUMN);
30 Console.WriteLine(SeasonTwo.AUTUMN);
31 //運行結果都為:AUTUMN
32 }
33}
如果不初始化值則從0開始,實際上面兩種定義方式定義得到的都是一個效果.
3. 對象的形式實現
何為對象的形式實現呢? 其實這個很簡單,也就是將需要枚舉的標識定義在對象裡,通過對象的特性將 其封裝.詳細如下代碼:
1public class SeasonOne
2{
3 public static readonly SeasonOne SPRING = new SeasonOne("春天");
4 public static readonly SeasonOne SUMMER = new SeasonOne("夏天");
5 public static readonly SeasonOne AUTUMN = new SeasonOne("秋天");
6 public static readonly SeasonOne WINTER = new SeasonOne("冬天");
7
8 public SeasonOne(string name)
9 {
10 this.name = name;
11 }
12
13 //成員
14 private string name;
15 public string Name
16 {
17 get { return name; }
18 set { name = value; }
19 }
20}
以上的形式實現很簡單, 不過好象已經偏離了"枚舉(enum)",因為實現已經由枚舉轉向為了類(class) 對象來實現了.定義一成員屬性,通過構造方法初始化,在類裡定義需要枚舉的只讀成員,通常不建議使用此 方式來實現. 我們可以這樣來測試:
1class Program
2{
3 static void Main(string[] args)
4 {
5 Console.WriteLine(SeasonOne.AUTUMN.Name);
6 //運行結果:秋天
7 }
8}
4. Java中的枚舉
在與C#語言一樣流行的JAVA中,枚舉還存在著另類故事,作為一個面向對象的開發者或是既將成為面向 對象的開發者的你,我想了解下另類語言的某些特性是有必要的.在JAVA中,枚舉除了上面所介紹的相關功 能外,還有其他的一些功能,下面將簡單的介紹下這些功能的應用.
枚舉裡定義抽象方法,標識符實現抽象方法
1enum Operator{
2 ADD {
3 public double calculate(double a,double b){
4 return a+b;
5 }
6 },
7 SUBSTRACT{
8 public double calculate(double a,double b){
9 return a-b;
10 }
11 },
12 MULTIPLY{
13 public double calculate(double a,double b){
14 return a*b;
15 }
16 },
17 DIVIDE{
18 public double calculate(double a,double b){
19 return a/b;
20 }
21 };
22 public abstract double calculate(double a,double b);
23}
枚舉裡定義屬性字段和構造方法
1enum Course{
2 COREJAVA("zhangsan"), //zhangsan學CoreJava
3 WEB("lisi"), //lisi學Web
4 EJB ("wangwu"); //wangwu學EJB
5
6 String name;
7 Course(String name){
8 this.name=name;
9 }
10 public String getName(){
11 return this.name;
12 }
13}
屬性字段,構造方法及抽象方法並存
enum Course{
COREJAVA("zhangsan"){
public void study(){
System.out.println("Study Corejava");
}
},
WEB("lisi"){
public void study(){
System.out.println("Study Web");
}
},
EJB ("wangwu"){
public void study(){
System.out.println("Study EJB");
}
};
String teachName;
Course(String name){
this.teachName=name;
}
public String getName(){
return this.teachName;
}
public abstract void study();
}
三. .NET Framework中的枚舉基類
在.NET Framework中枚舉基類(Enum)是一抽象類,位於System命名空間下,繼承了ValueType類和 IComparable, IFormattable, IConvertible接口,這裡以一個簡單的文本編輯作為示例介紹下枚舉在實際 中的應用.
簡單文本編輯器示例運行圖如下:
從上圖很容易看出,此文本編輯器主要是用於設置字體樣式,其實在實現這個簡單文本編輯器的時候就 是使用的字體樣式枚舉(FontStyle),FontStyle的源代碼定義如下:
1// 摘要:
2// 指定應用到文本的字形信息。
3[Flags]
4public enum FontStyle
5{}{
6 // 摘要:
7 // 普通文本。
8 Regular = 0,
9 //
10 // 摘要:
11 // 加粗文本。
12 Bold = 1,
13 //
14 // 摘要:
15 // 傾斜文本。
16 Italic = 2,
17 //
18 // 摘要:
19 // 帶下劃線的文本。
20 Underline = 4,
21 //
22 // 摘要:
23 // 中間有直線通過的文本。
24 Strikeout = 8,
25}
要實現上圖示的簡單文本編輯器很簡單,基本思路就是通過點擊上面字體樣式設置功能鍵,設置編輯區 域的文本字體樣式,這實現很簡單.在此,我就直接把代碼貼出來,有不清楚之處可從下面我提供的示例代碼 下載連接下載本文示例代碼查看.
1private void SetStyle(object sender,EventArgs e)
2{}{
3 ToolStripButton btn = sender as ToolStripButton;
4 FontStyle fontStyleContent = this.rchTxtContent.SelectionFont.Style;
5 FontStyle BtnFont = ( FontStyle)(Enum.Parse(typeof(FontStyle),btn.Tag.ToString ()));
6 if ((fontStyleContent | BtnFont) == fontStyleContent)
7 {
8 fontStyleContent = ~BtnFont & fontStyleContent;
9 }
10 else
11 {}{
12 fontStyleContent = fontStyleContent | BtnFont;
13 }
14 this.rchTxtContent.SelectionFont = new Font (this.rchTxtContent.SelectionFont.FontFamily,
15 this.rchTxtContent.SelectionFont.Size,
16 fontStyleContent,
17 this.rchTxtContent.SelectionFont.Unit);
18}
本文就介紹於此,更多請關注本系列後續文章
出處:http://beniao.cnblogs.com/
本文配套源碼