前程式碼建立整數陣列鏈表,用 IList 介面指標加入兩不同值。重載 OnInsert(),IntList 在加入型別時檢查型別,非整數拋出例外。基類提供預設方法,給我們機會在自有類別實作詳細行為。CollectionBase 實作的介面(IEnumerable、ICollection、IList)構成 IntList 公用 API,幾乎無需撰寫程式碼即可直接使用。
介面可被任意多個不相關型別實作。比起在基類編碼,實作介面提供更強伸縮性。.NET 強制單繼承,使實作介面顯得重要。比較兩方法:
public void PrintCollection(IEnumerable collection) { foreach(object o in collection) Console.WriteLine("Collection contains {0}", o.ToString()); }
public void PrintCollection(CollectionBase collection) { foreach(object o in collection) Console.WriteLine("Collection contains {0}", o.ToString()); }
第二個方法重用性遠不如第一個。Array、ArrayList、DataTable、HashTable、ImageList 等無法使用第二個方法。讓方法參數用介面,程式具通用性、更易重用。
許多應用程式用 DataSet 交換資料。直接回傳 DataSet 參考:
public DataSet TheCollection { get { return _dataSetCollection; } }
未來若改暴露 DataTable、DataView 或自訂物件,任何改變都破壞程式碼。修改公用介面意味著在大系統修改更多內容。第二問題:DataSet 提供大量方法修改內含資料,使用者可能刪除表、修改欄、取代所有物件,幾乎肯定非你所望。幸運的是,可限制使用者功能:不回傳 DataSet 參考,回傳期望使用者使用的介面。DataSet 支援 IListSource(資料繫結用):
using System.ComponentModel;
public IListSource TheCollection { get { return _dataSetCollection as IListSource; } }