【问题标题】:Automatic (and not refactor-related) extraction of interface from class从类中自动(而非重构相关)提取接口
【发布时间】:2014-04-07 08:11:57
【问题描述】:

我对 C# 比较陌生,所以这可能是一个有点幼稚的问题。

是否存在一种方法,或者甚至可以构造一个方法来构造一个包含类的所有公共方法/属性的接口?

我发现自己在一个使用模拟框架 Moq 的项目中。 Moq 有一个明显相当普遍的限制,即它只能处理接口和虚拟方法。项目的架构师决定走接口路线,这意味着项目中的每个类都有一个附带的接口。这意味着有负载由单个类实现的接口。此外,该样式要求接口进入它们自己的文件。这意味着项目中有加载个文件。

在我看来,如果这些仅用于 Moq 的接口和文件可以少一点干扰,那将是一个真正的改进。有没有办法让系统(Visual Studio/.Net/C#)创建它们。

例如,如果写这个

[ExtractAndImplement("IFoo")]
public class Foo
{
    public int Bar(int baz)
    {
        ...
    }
}

相当于

public interface IFoo
{
    int Bar(int baz);
}

public class Foo : IFoo
{
    public int Bar(int baz)
    {
        ...
    }
}

NB 不,Refactor -> Extract Interface 不能满足我的要求。首先,它在源代码的某个地方创建了一个接口,因此它不会减少单独实现的接口的混乱。其次,它是我需要明确维护的接口;当我在类中添加一个公共方法时,我需要将该新方法提取到正确的接口。不,我想要一些隐含的东西,即接口是动态创建的,不会弄乱源代码或项目。

我猜在 Lisp/Scheme 中它会使用宏来完成,而在 Haskell 中则使用模板。

【问题讨论】:

  • VS 确实有 Refactor > Extract Interface 命令。这就是你所追求的吗?
  • 有几个视觉工作室插件可以为你做这件事。 Code rush express being one
  • 附带说明,MOQ 只允许模拟接口或抽象类的原因是它需要动态构建一个覆盖模拟类功能的类。它只能对非具体类执行此操作。
  • Are Using Interfaces Soley to Facilitate Stubing and Mocking in Unit Tests Now Obsolete? 和类似的问题可能会有用。如果您只是使用接口进行模拟,也许您可​​以考虑 TDD 和状态测试,而不是 BDD 和行为测试。
  • 我正在考虑添加关于重构的注释 -> 提取接口 not 是我所追求的,但我决定反对它,因为我很难用一个好的措辞方式。我想这应该教会我。

标签: c#


【解决方案1】:

您可以在 Visual Studio 中执行此操作(不是在快速版本中)。 使用重构 -> 提取接口。光标需要放在类名上。

更多信息:

http://msdn.microsoft.com/en-us/library/fb3dyx26.aspx

您还可以查看 ReSharper 以获取此选项或 SharpDevelop。

【讨论】:

    【解决方案2】:

    可能要求

    界面语言是意大利语(上面写着“提取界面”),抱歉,我希望你得到了提示。

    【讨论】:

    • 这是核心VS的一部分吗?我不记得我的一个插件是否这样做了?
    • @Liam:是的,它是 VS 核心功能的一部分,但恐怕它不存在于 express 版本中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多