2011-09-27 73 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 
}