程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則19:選擇定義和實現接口而不是繼承(3)

Effective C#原則19:選擇定義和實現接口而不是繼承(3)

編輯:關於C語言

IListSource讓用戶通過GetList()方法 來訪問內容,它同時還有ContainsListCollection屬性,因此用戶可以修改全部 的集合結構。使用IListSource接口,在DataSet裡的個別對象可以被訪問,但 DataSet的所有結構不能被修改。同樣,調用者不能使用DataSet的方法來修改可 用的行為,從而在數據上移動約束或者添加功能。

當你的類型以類的方 式暴露一些屬性時,它就暴露了這個類的全部接口。使用接口,你可以選擇只暴 露一部分你想提供給用戶使用的方法和屬性。以前在類上實現接口的詳細內容, 在後來是可以修改的(參見原則23)。

另外,不相關的類型可以實現同樣 的接口。假設你在創建一個應用程序。用於管理雇員,客戶和賣主。他們都不相 關,至少不存在繼承關系。但他們卻共享著某些功能。他們都有名字,而且很有 可能要在一些Windows控件中顯示他們的名字:

public class Employee
{
 public string Name
 {
  get
  {
   return string.Format( "{0}, {1}", _last, _first );
  }
 }
 // other details elided.
}
public class Customer
{
 public string Name
  {
  get
  {
   return _customerName;
  }
 }
 // other details elided
}
public class Vendor
{
 public string Name
 {
  get
   {
   return _vendorName;
  }
 }
}

Eyployee,Customer和Vendor類不應該共享一個基類。但它們共 享一些屬性:姓名(正如前面顯示的那樣),地址,以及聯系電話。你應該在一個 接口中創建這些屬性:

public interface IContactInfo
{
 string Name { get; }
 PhoneNumber PrimaryContact { get; }
 PhoneNumber Fax { get; }
 Address PrimaryAddress { get; }
}
public class Employee : IContactInfo
{
 // implementation deleted.
}

對於不的類型使用一些通用的 功能,接口可以簡化你的編程任務。Customer, Employee, 和Vendor使用一些相 同的功能,但這只是因為你把它們放在了接口上。

使用接口同樣意味著 在一些意外情況下,你可以減少結構類型拆箱的損失。當你把一個結構放到一個 箱中時,這個箱可以實現結構上的所有接口。當你用接口指針來訪問這個結構時 ,你不用結構進行拆箱就可以直接訪問它。這有一個例子,假設這個結構定義了 一個鏈接和一些說明:

public struct URLInfo : IComparable
{
 private string URL;
 private string description;
 public int CompareTo( object o )
 {
   if (o is URLInfo)
  {
   URLInfo other = ( URLInfo ) o;
   return CompareTo( other );
  }
  else
   throw new ArgumentException(
    "Compared object is not URLInfo" );
 }
 public int CompareTo( URLInfo other )
 {
  return URL.CompareTo( other.URL );
 }
}

你可以為URLInfo的對象創建一個有序表, 因為URLInfo實現了IComparable接口。URLInfo結構會在添加到鏈表中時被裝箱 ,但Sort()方法不須要拆箱就可以調用對象的CompareTo()方法。你還須要對參 數(other)進行拆箱,但你在調用IComparable.CompareTo()方法時不必對左邊的 對象進行拆箱。

基類可以用來描述和實現一些具體的相關類型的行為。 接口則是描述一些原子級別的功能塊,不相關的具體類型都可以實現它。接口以 功能塊的方法來描述這些對象的行為。如果你明白它們的不同之處,你就可以創 建出表達力更強的設計,並且它們面對修改是有很加強的伸縮性的。類的繼承可 以用來定義一些相關類型。通過實現一些接口來暴露部份功能來訪問這些類型。

返回教程目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved