我不确定我是否在思考这个问题,但在过去,我在宣布上课时做了类似的事情:
IMyService myService = new MyService();
跳转到myService
会转到IMyService
界面。
但是,执行以下操作(显然)会将您带到MyService
。
var myService = new MyService();
哪个被认为是'正确'用法,或者是"What's your favourite ice cream flavor?"的另一个例子?
我看过most relevant question,但它并没有真正回答我的情况。
答案 0 :(得分:2)
还有这个选项......
var myService = new MyService() as IMyService;
这将使var myVar = IMyService类型......然后你可以在其他代码中做类似的事情......
if(myVar is MyService)
{
//instance specific stuff
}
答案 1 :(得分:1)
嗯,这取决于。您MyService
课程的所有公共成员是否(仅限)来自IMyService
界面的实施?或者有一些额外的公共成员(可能来自另一个接口的实现)?如果是这样,第二个“味道”将允许你看到这些额外的成员,而第一个不会。
另一方面,如果您正在使用接口,我会说“正确”用法是从依赖注入引擎或某种工厂类或方法获取类型实例,但我想这不在范围之内这个问题。
答案 2 :(得分:1)
您希望myService
是什么类型的?您希望它是IMyService
引用还是MyService
引用?一旦做出决定,其余的就会随之而来。
换句话说,只有你可以回答这个问题。
答案 3 :(得分:0)
这取决于您正确使用的含义。在带有接口的示例中,您将创建一个MyService
类的对象,并将其存储到IMyService
类的“指针”中。因此,您的对象ius实际上是MyService
的实例,但您的myService
var将其视为IMyService
接口。因此,您将无法调用任何方法/访问MyService
中不属于IMyService
的任何属性。
使用var
示例,您只是告诉编译器从声明的右侧计算myService
变量的类型。因此,在这种情况下,它与MyService myService
完全相同,这意味着您可以通过myService
变量访问MyService类的所有公共方法和属性。
答案 4 :(得分:-1)
我认为真正的问题是为什么将myService定义为接口。除非您希望能够为其分配其他IMyService,否则它没什么用处。在这种情况下,您必须将其定义为接口。