首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 19:優先定義與實作介面而非繼承(二)

     編輯:關於C語言

CollectionBase 基類與介面實作

前程式碼建立整數陣列鏈表,用 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 等無法使用第二個方法。讓方法參數用介面,程式具通用性、更易重用。

用介面定義 API 限制使用者權限

許多應用程式用 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; } }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved