【问题标题】:Is it possible to superimpose an interface on an external class in C#?是否可以在 C# 中的外部类上叠加接口?
【发布时间】:2013-07-07 01:58:13
【问题描述】:

为了将类的具体实现隐藏在接口后面,例如依赖注入,我发现提取具有我感兴趣的方法和属性的接口很有用。即使对于生成的类,我通常也可以制作实现提取接口的部分类。

但如果我想为外部类提取接口,例如从.dll,我找不到任何方法来做到这一点。有没有可能?

【问题讨论】:

  • 把那匹马放在车前。定义接口,让你的类实现它。
  • 只要我控制代码就可以了,但是我在想我什么时候使用外部库的代码。

标签: c# class interface


【解决方案1】:

最简单的方法通常是包装类来实现适配器模式。所以如果我们开始:

public class NastyExternalClass
{
    public void Foo() { ... }
}

我们添加:

public interface IFooable
{
    void Foo();
}

public sealed class NastyExternalClassWrapper : IFooable
{
    private readonly NastyExternalClass original;

    public NastyExternalClassWrapper(NastyExternalClass original)
    {
        this.original = original;
    }

    public void Foo()
    {
        original.Foo();
    }
}

这很乏味 - 虽然它可以自动化,如果 R# 或类似工具已经支持这一点,我不会感到惊讶 - 但它通常可以工作。

如果多个对象需要相互了解,并使用原始 API...或者只是忍受不完美:(

【讨论】:

    【解决方案2】:

    听起来您想使用adapter pattern,以允许以您定义的委托调用第三方库的类型实现您的接口。

    【讨论】:

      【解决方案3】:

      不,您不能更改不受您控制的课程。一些替代方案:

      继承:您可以创建一个确实使用基类方法实现接口的子类

      封装:您可以“包装”外部类,使其成为实现接口的更大类的一部分,并将接口方法传递给内部类。

      有时不能选择继承(例如基类为sealed 时),但在大多数情况下封装应该是可行的。

      【讨论】:

      • 感谢您提供有关继承的提示 :) 当我正在使用的对象在我的控制之外实例化时,它不会解决这种情况...
      • @uffjohn 没有什么可以让您将接口注入到您无法控制的类中。
      • 这就是我所害怕的......适配器模式就是这样:)
      猜你喜欢
      • 1970-01-01
      • 2019-12-07
      • 2018-07-29
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      相关资源
      最近更新 更多