3

我不确定我是不是想多了,但在过去,我在声明一个类时做过这样的事情:

IMyService myService = new MyService();

跳入myService将带您进入IMyService界面。

但是,执行以下操作将(显然)将您带到MyService.

var myService = new MyService();

哪个被认为是“正确”的用法,或者这是“你最喜欢的冰淇淋口味是什么?”的另一个例子。?

我已经查看了最相关的问题,但它并没有真正回答我的情况。

4

5 回答 5

2

还有这个选项...

var myService = new MyService() as IMyService;

这将使 var myVar = IMyService 类型...然后您可以在其他代码中执行类似...

if(myVar is MyService)
{
    //instance specific stuff 
}
于 2011-09-27T08:47:57.123 回答
1

这要看情况。您MyService类的所有公共成员是否(仅)来自IMyService接口的实现?还是有一些额外的公共成员(可能来自另一个接口的实现)?如果是这样,第二个“味道”会让你看到这些额外的成员,而第一个不会。

另一方面,如果您使用的是接口,我会说“正确”的用法是从依赖注入引擎或某种工厂类或方法获取类型实例,但我想这超出了这个问题的范围.

于 2011-09-27T08:40:10.877 回答
1

你想myService成为什么类型?你希望它是IMyService参考还是MyService参考?一旦你做出决定,其余的就会随之而来。

换句话说,只有你能回答这个问题。

于 2011-09-27T08:44:30.857 回答
0

这取决于正确使用的含义。在带有接口的示例中,您正在创建一个MyService类对象并将其存储到类的“指针”中IMyService。所以你的对象实际上是一个实例MyService,但是你的myServicevar 把它当作IMyService接口。因此,您将无法调用任何方法/访问任何MyService不在IMyService.

使用var示例,您只是告诉编译器myService从声明的右侧计算变量的类型。因此,在这种情况下,它与 绝对相同MyService myService,这意味着您可以通过myService变量访问 MyService 类的所有公共方法和属性。

于 2011-09-27T08:42:45.690 回答
-1

我想真正的问题是为什么将 myService 定义为接口。除非您希望能够将其他 IMyService 分配给它,否则它没有多大用处。在这种情况下,您必须将其定义为接口。

于 2011-09-27T08:46:23.757 回答