從上面可以看出,屬性的這些規則與方法十分類似。對於屬性的訪問器,我們可以把get訪問器看成是一個與屬性修飾符相同、沒有參數、返回值為屬性的值類型的方法;把set訪問器看成是一個與屬性修飾符相同、僅含有一個value參數、返回類型為void的方法。還記得第十章中客戶住宿的例子嗎?還是讓我們擴展這個例子來說明屬性在繼承中的一些問題。
程序清單14-8:
using System; public enum sex { woman, man, }; abstract public class People { private string s_name; public virtual string Name{ get{ return s_name; } } private sex m_sex; public virtual sex Sex{ get{ return m_sex; } protected string s_card; public abstract string Card { get;set; } }
上面的例子中聲明了“人”這個類,人的姓名Name和性別Sex是兩個只讀的虛屬性;身份證號Card是一個抽象屬性,允許讀寫。因為類People中包含了抽象屬性Card,所以Pelple必須聲明是抽象的。下面我們為住宿的客人編寫一個類,類從People中繼承。
程序清單14-9:
class Customer:People { string s_no; int i_day; public string No{ get{ return s_no; } set{ if(s_no!=value){ s_no=value; } } } public int Day{ get{ return i_day; } set{ if(i_day!=value){ i_day=value; } } } public override string Name{ get{return base.Name;} } public override sex Sex{ get(return base.Sex} } public override string Card{ get{ return s_card; } set{ s_card=value; } } }
在類Customer中,屬性Name、Sex和Card的聲明都加上了override修飾符,屬性的聲明都與基類People中保持一致。Name和Sex的get訪問器、Card的get和set訪問器都使用了base關鍵字來訪問基類People中的訪問器。屬性Card的聲明重載了基類People中的抽象訪問器。這樣,在Customer類中沒有抽象成員的存在,Customer可以是非虛的。