簡體   English   中英

傳遞接口而不是 object 實例

[英]Passing an interface instead of an object instance

以 SqlBulkCopy.WriteToServer() 方法為例。 其中一個重載將 IDataReader 作為參數。 我的問題是,將接口傳遞給方法而不是 object 實例本身有什么好處/優勢?

http://msdn.microsoft.com/en-us/library/434atets.aspx

對於那個接口,您可以有許多可能的實現。 依賴抽象(在這種情況下是接口)比實際的具體 class 更好 - 這允許更好的靈活性和可測試性。

這也將重點放在了WriteToServer()方法真正需要的東西上——它的合約唯一需要的是讓調用者傳入提供由IDataReader接口聲明的方法/屬性的具體 class 的任何實例。

傳遞接口意味着您可以傳遞任何實現該接口的 object,而不僅僅是一個特定的 object。

這使代碼更加靈活,因為它不必知道現在或將來可能實現接口的所有可能對象。

它還使它更加健壯,因為它只需要處理接口上眾所周知和定義的屬性和方法。

形參類型是接口類型——這意味着您可以傳入任何實現此接口的 object(或者更確切地說,是實現該接口的 object 的實例)。

您不是在傳遞接口,而是在傳遞符合接口定義的合同的object

因此,如果您的數據源是 SQL 服務器,則您將傳遞SqlDataReader ,如果 Oracle 則傳遞OracleDataReader

您還可以實現自己的數據讀取器並將其傳遞給 function,甚至編寫一個模擬數據讀取器來徹底測試該方法。

這是一個眾所周知的設計原則 - Program to an Interface, not an implementation

並來自 MSDN -何時使用接口

接口是一種強大的編程工具,因為它們讓您可以將對象的定義與其實現分開。

當一個方法將其 arguments 之一列為接口時,它並不要求您傳入該接口的實例(無論如何這是不可能的,您可以創建接口實例),它要求您傳入任何實現的 object那個界面。

例子:

interface IMyObject {
    public void SomeMethod();
}

public class MyObject : IMyObject {
    public void SomeMethod() {
        // implementing code here
    }
}

您現在可以將 MyObject 的任何實例作為 IMyObject 類型的參數傳遞:)

public class YourObject {
    public void DoSomething(IMyObject o) {
        // some code here
    }
}

YourObject yo = new YourObject();
MyObject   mo = new MyObject();
yo.DoSomething(mo); // works

我希望這是有道理的!

實際上,它希望您傳遞實現接口的類型的實例,而不是接口本身。

當方法只關心接口聲明的方法時,使用接口類型。 只要 object 實現了該接口,其中定義的方法就可以在 object 上調用。

這是接口的原因之一——在這個例子中,接口的所有消費者(即函數)關心的是它可以讀取數據——它不介意它是來自SqlDataReader還是OleDataReader或任何其他provider - 替代方案將為每個可能的 Data Reader 提供幾乎相同的單獨重載(這當然是不切實際的,因為有人可能會為 dBase 或更奇特的數據庫引擎提供一個)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM