1: class baseclass 2: { 3: public void testmethod() 4: { 5: console.writeline("baseclass::testmethod"); 6: } 7: } 8: 9: class derivedclass:baseclass 10: { 11: new public void testmethod() 12: { 13: console.writeline("derivedclass::testmethod"); 14: } 15: }
使用了附加的new修飾符,編譯器就知道你重定義了基類的方法,它應該屏蔽基類方法。但是,如果
你按以下方式編寫: derivedclass test = new derivedclass(); ((baseclass)test).testmethod(); 基類方法的實現就被調用了。這種行為不同于改寫方法,后者保證大部分派生方法獲得調用。 5.3 類屬性 有兩種途徑揭示類的命名屬性——通過域成員或者通過屬性。前者是作為具有公共訪問性的成員變量而被實現的;后者并不直接回應存儲位置,只是通過 存取標志(accessors)被訪問。 當你想讀出或寫入屬性的值時,存取標志限定了被實現的語句。用于讀出屬性的值的存取標志記為關鍵字get,而要修改屬性的值的讀寫符標志記為set。在你對該理論一知半解以前,請看一下清單5.9中的例子,屬性squarefeet被標上了get和set的存取標志。 清單 5.9 實現屬性存取標志 1: using system; 2: 3: public class house 4: { 5: private int m_nsqfeet; 6: 7: public int squarefeet 8: { 9: get { return m_nsqfeet; } 10: set { m_nsqfeet = value; } 11: } 12: } 13: 14: class testapp 15: { 16: public static void main() 17: { 18: house myhouse = new house(); 19: myhouse.squarefeet = 250; 20: console.writeline(myhouse.squarefeet); 21: } 22: }
house類有一個命名為squarefeet的屬性,它可以被讀和寫。實際的值存儲在一個可以從類內部訪問的變量中——如果你想當作一個域成員重寫它,你所要做的就是忽略存取標志而把變量重新定義為: public int squarefeet; 對于一個如此簡單的變量,這樣不錯。但是,如果你想要隱藏類內部存儲結構的細節時,就應該采用存取標志。在這種情況下,set 存取標志給值參數中的屬性傳遞新值。(可以改名,見第10行。) 除了能夠隱藏實現細節外,你還可自由地限定各種操作: get和set:允許對屬性進行讀寫訪問。 get only:只允許讀屬性的值。 set only:只允許寫屬性的值。 除此之外,你可以獲得實現在set標志中有效代碼的機會。例如,由于種種原因(或根本沒有原因),你就能夠拒絕一個新值。最好是沒有人告訴你它是一個動態屬性——當你第一次請求它后,它會保存下來,故要盡可能地推遲資源分配。
5.4 索引 你想過象訪問數組那樣使用索引訪問類嗎 ?使用c#的索引功能,對它的期待便可了結。
語法基本上象這樣: 屬性 修飾符 聲明 { 聲明內容}
具體的例子為 public string this[int nindex] { get { ... } set { ... } }