【问题标题】:Is it possible to break an interface into 2 partial interfaces and implement it in 2 partial classes?是否可以将一个接口分成 2 个部分接口并在 2 个部分类中实现它?
【发布时间】:2011-08-19 13:39:12
【问题描述】:

我正在为我的雇主对第三方产品进行相当广泛且持续的修改。实现我的代码时的主要考虑因素之一是尽可能地将其隔离,以使来自供应商的更改的集成尽可能轻松。到目前为止,完成此任务的最有用的工具之一是部分类。使用部分类,我可以将必须​​实现的任何新方法保留在它们自己的文件中。

但是今天我遇到了一个小问题,我需要解决一些问题。假设我需要扩展以下接口。

public partial interface ICondition
{
  void MethodA();
  void MethodB();
}

通过使界面成为部分界面并添加一个名为 ICondition.CompanyName.cs 的文件

public partial interface ICondition
{
  void MethodC();
}

现在我想做的是以我声明它的相同方式实现接口,MethodA()MethodB() 在部分类的一个文件中实现,MethodC() 在另一个文件中实现。

public partial class Condition : ICondition
{
   public void MethodA(){ }
   public void MethodB(){ }
}

和我的班级 Condition.CompanyName.cs

public partial class Condition : ICondition
{
   public void MethodC() { }
}

这当然行不通,因为接口必须全部在同一个文件中实现。我希望有一些声明,或者我不知道的一些语法魔术,可以让我做我想做的事情,并将这些方法保存在单独的文件中,但接口相同。

编辑

这确实有效,我的问题是由于一个愚蠢的拼写错误,我的 2 个部分类位于不同的命名空间中。我想我今天早上开始的有点早,感谢大家的时间和关注。

【问题讨论】:

  • 周五的感觉是允许的,我设法忘记了 C# 早一点在答案中有ref 关键字......我的意思是,怎么?!?
  • @Adam,因为没有人用过它
  • @RichK 是的,但我通过回答“如何通过引用传递值类型?”这个问题让情况变得更糟。用“你不能,C# 不支持……”哈哈!
  • @Adam 哇哦,忘记它是一回事,直接否认它的存在是很特别的!

标签: c# partial-classes


【解决方案1】:

在这种情况下你不需要部分接口,你应该仍然可以将方法放在你想要的地方。

这当然不行,因为接口必须全部实现 在同一个文件中

我看不出您的示例如何不起作用,我只是做了以下操作:

partial interface IFoo
{
    void One();
    void Two();
}

partial class Class1 : IFoo
{
    public void Two()
    { }

    public void Three()
    { }
}

在一个文件中。

partial interface IFoo
{
    void Three();
}

partial class Class1 : IFoo
{
    public void One()
    { }
}

在另一个...

【讨论】:

  • 你可以在不同的分部类中实现不同的接口,它们会聚合成最终的结果。
  • 我不需要部分接口,但我想要一个,因为它可以更容易地合并来自供应商的更改,因为他的文件大部分不会改变。 (当然保存新的部分声明)
  • @Jonathan 我也不能真正做不同的接口,因为代码使用对象作为 ICondition。如果我有 2 个接口做一个接口的工作,我以后使用对象时如何管理类型杂耍?
  • @Matthew。我用不相关(但有趣)的信息来扩展他的答案。关键是:接口和类都支持部分声明。放置方法的部分类由您决定 - 但您只需要在其中一个上使用 : ICondition
  • @Matthew 也许部分定义在不同的命名空间中?我刚刚更改了我的命名空间来尝试它,我得到了你描述的错误。
【解决方案2】:

也许你的部分类不在同一个程序集中?

否则,您的示例应该可以正常工作...

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 2021-06-21
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多