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 { ... } }