【问题标题】:Partial Interface in C#C# 中的部分接口
【发布时间】:2018-02-18 09:05:14
【问题描述】:

C# 允许部分接口吗?即,在 ManagerFactory1.cs 类中,我有

public partial interface IManagerFactory
{
    // Get Methods
    ITescoManager GetTescoManager();
    ITescoManager GetTescoManager(INHibernateSession session);
}

在 ManagerFactory.cs 类中,我有:

public partial interface IManagerFactory
{
    // Get Methods
    IEmployeeManager GetEmployeeManager();
    IEmployeeManager GetEmployeeManager(INHibernateSession session);
    IProductManager GetProductManager();
    IProductManager GetProductManager(INHibernateSession session);
    IStoreManager GetStoreManager();
    IStoreManager GetStoreManager(INHibernateSession session);
}

ManagerFactory 和 ManagerFactory1 都位于同一个程序集中。

【问题讨论】:

    标签: c#


    【解决方案1】:

    最简单的方法就是尝试一下:)

    但是是的,部分接口是允许的。

    partial 修饰符的有效位置(带有 C# 3.0 规范参考):

    • 类 (10.1.2)
    • 结构 (11.1.2)
    • 接口 (13.1.2)
    • 方法 (C# 3.0+) (10.2.7; 10.6.8)

    规范的第 10.2 节包含部分类型的大部分一般细节。

    位置无效:

    • 枚举
    • 代表

    【讨论】:

    • 分部方法非常有趣 - 它们允许您在分部类的一半中创建函数原型并在另一半中添加方法实现。
    • @Stormenet 听起来是个坏主意。 (滥用):(合法的)口粮必须是天文数字。
    • @Michael 这通常在代码生成的代码中完成。这允许修改生成的类的行为,而无需从它们继承,因此无需调用虚函数的开销。
    • @Michael,我不打算使用它,但知道它的存在很好:)
    • @Michael Meadows,部分方法总是私有的,所以应该限制滥用:)
    【解决方案2】:

    是的,确实如此。

    Partial Classes and Methods (C# Programming Guide) 在 MSDN 上

    限制:

    • 所有属于同一类型的部分类型接口定义必须使用<strong>partial</strong> 进行修改
    • 部分修饰符只能出现在关键字interface之前。
    • 所有属于同一类型的部分类型定义必须在同一程序集和同一模块(.exe 或 .dll 文件)中定义。

    涉及代码生成时,主要使用部分接口。例如,当界面的一部分是生成的,而另一部分是用户编写的。

    【讨论】:

      【解决方案3】:

      确实如此,但一个重要的问题是为什么?

      存在部分类,以便您可以扩展自动生成的代码。 VS 可以生成表单文件,或代码隐藏,或 Linq to SQL 访问器,您可以使用部分扩展它。

      我会避免使用分部来拆分类(或者在这种情况下是接口),因为这通常会产生比其价值更多的混乱。

      在这种情况下,我会调查为什么这需要跨多个文件 - 工厂模式接口可以使通过代码进行回溯变得更加复杂,但在这里您将通过多个文件进行回溯。

      【讨论】:

      • 我通常不会设计有部分类和接口。但是我从代码生成中得到了类和接口。所以我必须使用部分来容纳代码
      • 很公平——虽然我会小心生成的接口——如果它们改变了你对它们的实现很可能会中断。
      • 我发现当您在团队中工作并使用源代码控制(在我们的例子中为 SVN)时,部分修饰符非常棒。我们设置了诸如服务或帮助类之类的东西,它们包含很多方法,并使用部分修饰符将每个方法放在一个单独的 cs 文件中。这使我们可以只签入更改的方法文件,并提供对那段代码的更好的更改历史记录。它还减少了签入期间的冲突。
      • @Frank 我从来不需要那个——当开发人员在文件的不同部分使用不同的方法时,合并工作得很好,blame 功能可以告诉你究竟是谁编辑的每一行。我发现 SVN 和 TFS 都是这种情况。但是,您的策略对于 VSS 或 Vault 等签出/签入模型会很有用。
      • @Keith 有时最好使用“部分”将界面分成不同的部分。例如,当内容太长而无法阅读时,即使您已使用#region 标签分隔它们。
      【解决方案4】:

      是的,it does

      【讨论】:

        【解决方案5】:

        在使您的界面局部化之前请三思而后行。也许最好将它分成两个 itnerfaces?

        让您的界面小而专注。部分是代码气味。

        【讨论】:

          【解决方案6】:

          不错。

          我同意这可能是一种气味,但我仍然可以想到一个这样做的理由。

          我目前正在为 WPF 和 Silverlight 开发应用程序 MVVM 框架。我遇到的是 WPF 和 Silverlight 如此不同,以至于部分接口/类实际上可以区分两个框架之间的差异,并且仍然保持代码干净和几乎单一来源,而不是在代码中使用定义。

          【讨论】:

            【解决方案7】:

            查看docs 声明它可以用于类、结构或接口

            【讨论】:

              【解决方案8】:

              简短:是的!

              【讨论】:

                【解决方案9】:

                是的,确实如此。两个部分接口是否定义在同一个命名空间中?

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-06-22
                  • 2010-11-16
                  • 2019-12-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多