這次我要向大家講的是C#中的屬性.屬性是什麼呢,比如說我是男的,男就是我的一人屬性.我是一個大一的學生,大一也是我的一個屬性.屬性就是一個對象的性質.很簡單吧,呵呵!下面,我給出兩個例子,第一個例子出明了如何聲明一個可以修改的屬性,另一個例了建立了一個抽象的屬性(Abstract),並且說明了如何在子類中丟棄它.好,下面讓我們開始吧.
例子一:
000: // Properties\person.cs 001: using System; 002: class Person 003: { 004: private string myName ="N/A"; 005: private int myAge = 0; 006: 007: // 聲明一個字符型的屬性Name 008: public string Name 009: { 010: get 011: { 012: return myName; 013: } 014: set 015: { 016: myName = value; 017: } 018: } 019: 020: // 聲明一個int型的Age屬性 021: public int Age 022: { 023: get 024: { 025: return myAge; 026: } 027: set 028: { 029: myAge = value; 030: } 031: } 032: 033: public override string ToString() 034: { 035: return "Name = " + Name + ", Age = " + Age; 036: } 037: 038: public static void Main() 039: { 040: Console.WriteLine("Simple Properties"); 041: 042: // 建立一個Person的實例 043: Person person = new Person(); 044: 045: file://打印出它的屬性 046: Console.WriteLine("Person details - {0}", person); 047: 048: // 對屬性進行一些設置 049: person.Name = "Joe"; 050: person.Age = 99; 051: Console.WriteLine("Person details - {0}", person); 052: 053: // 增加年齡 054: person.Age += 1; 055: Console.WriteLine("Person details - {0}", person); 056: } 057: }
這個例子的輸出是:
Simple Properties Person details - Name = N/A, Age = 0 Person details - Name = Joe, Age = 99 Person details - Name = Joe, Age = 100
好了,又起床了,昨天寫到這,就跑到床上睡了,呵呵.現在是五一的第二天,看看我今天能寫幾篇,昨天寫了二篇.
從上面的程序我們可以看出,一個類的屬性的設置,借用了VB的概念,和JAVA中不盡相同了.(這就是M$,TMD!)有的朋友可能很奇怪,為什麼我們可以用Console.WriteLine()來打印一個對象person呢.其實道理很簡單,和在JAVA中的一樣,當調節器用一個打印方法時,這個對象自動調用它的ToString()(在JAVA中是toString,TMD,又差點犯錯!)方法.在33行,我們可以看到有這個方法的影子,override這個關鍵字大概就是覆蓋父類的方法吧,這是不是有點多余?我們可以看到,一個對象的屬性的設置是通過一個get()和set()組合來完成的,當然,還有一個value這個東東.補充一下,你還可以控制一個屬性的讀/寫權限,只是把get()和set()簡單地去掉就可以了,比如你不要寫的屬性,就不要set()就可以了,如果你不要讀,就不要get()吧.總得感覺,C#在這點上沒有JAVA來的靈活(完了,又要被蓋癡打了!).
第二個例子:
這個例子說明了如何建立抽象的屬性(Abstract),什麼是抽象的屬性呢,所謂的抽象的屬性呢,就是一個抽象類並不提供執行屬性存取程序,並且,他可以在子類中被忽略.下面的例子有三個文件,你要分別編譯它們才能得到結果,它們是:
abstractshape.cs: Shape類,包含一個Area抽象屬性
shapes.cs: Shape的子類
shapetest.cs: 顯示程序.
要編譯這些程序,運行:csc abstractshape.cs shapes.cs shapetest.cs就可以了.運行完之後,它會產生shapetest.exe這個可執行程序.
000: // Properties\abstractshape.cs 001: using System; 002: 003: public abstract class Shape 004: { 005: private string myId; 006: 007: public Shape(string s) 008: { 009: Id = s; // 這句調用了Id屬性的set構建器 010: } 011: 012: public string Id 013: { 014: get 015: { 016: return myId; 017: } 018: 019: set 020: { 021: myId = value; 022: } 023: } 024: 025: public abstract double Area 026: { 027: get; 028: } 029: 030: public override string ToString() 031: { 032: return Id + " Area = " + double.Format(Area, "F"); 033: } 034: }
看這個程序, 實際上非常地簡單,當這個類對的對象被建立時,初始化部分為007-010,它把建立對象的參數s給了Id這個屬性.然後進行了上一個例子的操作.實際上,我們可以把抽象屬性與JAVA中的接口(Interface)相比,它們只提拱一個方法的名稱,而不提供這個方法的內容.就像Area這個抽象屬性,有一個get,但是它並沒有指定get方法(也許它不能稱之為方法)裡的內容,即要get做什麼事情. 這個事情,由它的子類來做.