2011-09-27 77 views
3

我不知道如果我這個得太多,但在過去,聲明一個類時,我做了這樣的事情:使用的類型聲明變種,而不是明確設置接口類型

IMyService myService = new MyService(); 

跳到myService將帶您到IMyService接口。

但是,執行以下操作(顯然)會帶您到MyService

var myService = new MyService(); 

這被認爲是「正確」的用法,或者這是"What's your favourite ice cream flavor?"另一個例子嗎?

我看過most relevant question,但它並沒有真正回答我的情況。

+0

你的問題標題具有誤導性。您詢問是否將其聲明爲具體類型或界面。後者有其好處,但只有你自己知道。 – nawfal

+0

@nawfal如果您覺得這是誤導性的,歡迎您將其改爲有意義的東西。然而,對我來說,三年來對我來說仍然是有意義的:| –

+0

我沒有編輯它,因爲我擔心OP會發現它太劇烈。問題標題問了一些關於'var'的問題,但實質上問題(在本體中)更多*具體類型vs接口類型*。所以我很困惑你是否在尋找'var'的重要性,或者你想知道接口的重要性。如果你澄清,我會編輯它。不挑剔,只是想讓它成爲一個更好的地方。 – nawfal

回答

1

嗯,這取決於。你的MyService課程的所有公共成員是否(僅限於)實現IMyService接口?或者有一些額外的公共成員(可能來自另一個接口的實現)?如果是這樣,第二個「味道」會讓你看到這些額外的成員,而第一個不會。另一方面,如果你正在使用接口,我會說「正確的」用法是從依賴注入引擎或某種工廠類或方法獲取類型實例,但我想那是在這個問題的範圍。

+0

您對從IOC獲取類型實例是正確的。這是我在申請中擔心的一件事。 –

0

這取決於你的意思是正確的用法。在具有接口的示例中,您正在創建MyService類的對象,並將其存儲到IMyService類的「指針」中。因此,您的對象實際上是MyService的一個實例,但您的myService var將它視爲IMyService接口。因此,您將無法調用任何方法/訪問不在IMyService中的MyService的任何屬性。

使用var示例,您只是告訴編譯器計算聲明右側的myService變量的類型。因此,在這種情況下,它與MyService myService完全相同,這意味着您可以通過myService變量訪問MyService類的所有公共方法和屬性。

1

你想要myService是什麼類型?你想要它是一個IMyService參考或MyService參考嗎?一旦你做出了這個決定,其餘的依然如此。

換句話說,只有你可以回答這個問題。

-1

我想真正的問題是爲什麼你定義myService作爲接口。除非您希望能夠將其他IMyService分配給它,否則它沒有多大用處。在這種情況下,您必須將其定義爲接口。

+0

接口的使用各不相同。例如國際奧委會和嘲笑,因爲他們在一些答案中提到。沒有界面,這樣做會非常棘手。 –

2

也有這個選項...

var myService = new MyService() as IMyService; 

這將使VAR myVar的= IMyService類型......然後你可以在其他代碼做這樣的事情......

if(myVar is MyService) 
{ 
    //instance specific stuff 
}