【问题标题】:Why are "Extracted Interfaces" Internal rather than Public?为什么“提取的接口”是内部的而不是公共的?
【发布时间】:2010-06-11 15:46:06
【问题描述】:

Visual Studio 包含一个名为“Extract Interface”的重构函数,它基于类实现生成一个接口。

提取的接口默认是内部的。问题是,我们最终将几乎所有这些都更改为Public。

有谁知道为什么它默认是内部的?更好的是,有没有办法将其自定义为默认为Public?

【问题讨论】:

    标签: visual-studio refactoring conventions


    【解决方案1】:

    如果您更改接口的 Visual Studio 模板,它可能会起作用(我没有尝试过,但假设这应该起作用)。

    对于 Visual Studio 2008,模板存储在

    "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates
        \CSharp\Code\1033\Interface.zip"
    

    这在this answer中有更详细的描述。

    【讨论】:

    • 这适用于更改新的接口、类等,但不适用于更改重构工具的“提取接口”功能的输出。 :( 不过谢谢。
    • @Rox Wen:好的,我明白了。我想到的另一件事是:VS 还有一个用于创建新接口的内置代码 sn-p。也许这个被使用了,你可以修改它?该位置位于“C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Visual C#\interface.sn-p”下。
    • @0xA3 不,刚刚尝试了 sn-p。这并不是说。你能想到其他地方吗?
    • @Heliac:路径是否与您的 Visual Studio 版本匹配?
    • 我的路径略有不同(VS2012),但我做对了。就像@RoxWen 说的......这不适用于“提取界面”生成工具,仅适用于添加新
    【解决方案2】:

    我没有参考,但我猜想为什么它默认是内部的。

    假设您有 3 个项目/程序集:log4net(第 3 方 API)、MyApp.Util 和 MyApp.Web(一个 Web 项目)。 Web 引用 Util,后者引用 log4net。 Web 确实不引用 log4net,而您希望保持这种方式。

    在 DAL 内部,假设您有一个内部类,其成员之一引用了 log4net 中定义的类型。它可以是返回类型或方法的参数类型之一,或属性的类型。

    假设您从上述类中提取了一个接口,包括上述引用 log4net 的成员。好吧,如果您将该成员设为公共(公共接口的一部分)并引用实现它的类型,那么您要求 Web 项目引用 log4net。

    通过将接口设为内部,Web 可能会继续不了解 log4net。

    【讨论】:

    • @John - 我基本上试过这个。我现在正在看一个示例,其中 Web 引用 DAL 引用 NHibernate,但 Web 不引用(也不能使用)NHibernate。如果 Web 引用,例如,实现 NHibernate.ISession 的类型,那么它将不再构建,因为它需要 NHibernate 引用。即,如果您使现有类型实现公共接口,您可能会在某处破坏构建,因为 C#(在 .NET 中?)中的所有继承都是公共的。
    • @John - 我将其标记为 CW 以获得关于动机的更权威的答案,因此其他人可以进行编辑以确保正确性。那是个坏主意吗? :( 自我注意:RTM。
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2023-04-04
    • 2012-05-10
    • 2013-04-11
    • 2013-02-02
    • 2020-03-03
    • 2013-01-01
    • 2018-11-12
    相关资源
    最近更新 更多