【发布时间】:2010-11-05 17:46:29
【问题描述】:
我仍然无法理解接口的用途。我阅读了一些教程,但我仍然不知道它们的真正用途是“它们让你的类信守承诺”和“它们有助于多重继承”。
就是这样。我仍然不知道我什至何时会在实际工作示例中使用接口,甚至何时确定何时使用它。
根据我对接口的有限了解,它们可以提供帮助,因为如果有东西实现它,那么您可以只传递接口以允许传入不同的类,而不必担心它不是正确的参数。
但我永远不知道这样做的真正意义是什么,因为他们通常会在这一点上停止显示代码在通过接口后会做什么,如果他们这样做了,他们似乎没有做任何有用的事情我可以看着然后去“哇,他们会在现实世界的例子中提供帮助”。
所以我想我想说的是我正在尝试找到一个真实世界的示例,我可以在其中看到正在运行的界面。
我也不明白你可以像这样引用对象:
ICalculator myInterface = new JustSomeClass();
所以现在如果我去 myInterface dot 和 intellisense 会拉起来,我只会看到接口方法,而不是 JustSomeClass 中的其他方法。所以我还没有看到这一点。
我还开始在他们似乎喜欢使用接口的地方进行单元测试,但我仍然不明白为什么。
比如这个例子:
public AuthenticationController(IFormsAuthentication formsAuth)
{
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
}
public class FormsAuthenticationWrapper : IFormsAuthentication
{
public void SetAuthCookie(string userName, bool createPersistentCookie)
{
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
}
public void SignOut()
{
FormsAuthentication.SignOut();
}
}
public IFormsAuthentication FormsAuth
{
get;
set;
}
为什么要费心制作这个界面?为什么不直接使用其中的方法制作 FormsAuthenticationWrapper 并收工?为什么先做一个接口,然后让 Wrapper 实现接口,最后再写方法?
那我不明白这句话的真正含义。
就像我现在知道声明是这样说的
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
如果 formsAuth 为 null,则创建一个新的 FormsAuthenticationWrapper,然后将其分配给作为接口的属性。
我想这可以追溯到为什么引用事物的全部意义。特别是在这种情况下,因为所有方法都完全相同。 Wrapper 没有接口没有的任何新方法,我不确定,但是当你这样做时,方法被正确填充(即它们有一个主体)它们不会被转换为存根,因为那看起来真的毫无意义对我来说(它将被转换回接口)。
然后在测试文件中他们有:
var formsAuthenticationMock = new Mock<AuthenticationController.IFormsAuthentication>();
所以他们只是传入 FormsAuthentication ,我猜这是所有假存根。我猜包装类是在程序实际运行时使用的,因为它有真正的方法可以做一些事情(比如注销一个人)。
但是查看新的 Mock(来自 moq)它接受一个类或一个接口。为什么不再次让包装类将这些方法放入然后在新的 Mock 调用中呢?
这不只是为您制作存根吗?
【问题讨论】:
-
问题有点太长了……
-
我也正要提出这个问题 :) Thxs chobo2
标签: c# .net asp.net-mvc interface