5

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

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

4

3 回答 3

15

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

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……或者原始 API 添加回调然后绕过包装器等,这将成为一个更大的问题。在这些情况下,您需要更有创造力或只是活下去不完美:(

于 2013-07-09T12:53:49.363 回答
1

听起来您想使用适配器模式,以允许以您定义的类型实现接口,该类型代表对第三方库的调用。

于 2013-07-09T12:54:48.243 回答
1

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

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

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

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

于 2013-07-09T12:56:54.310 回答