为了将类的具体实现隐藏在接口后面,例如对于依赖注入,我发现提取具有我感兴趣的方法和属性的接口很有用。即使对于生成的类,我通常也可以创建一个部分类它实现了提取的接口。
但是如果我想为外部类提取接口,例如从.dll 中,我找不到任何方法来做到这一点。甚至可能吗?
最简单的方法通常是包装类来实现适配器模式。所以如果我们开始:
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 添加回调然后绕过包装器等,这将成为一个更大的问题。在这些情况下,您需要更有创造力或只是活下去不完美:(
听起来您想使用适配器模式,以允许以您定义的类型实现接口,该类型代表对第三方库的调用。
不,您不能更改不受您控制的课程。一些替代方案:
继承:您可以使用基类方法创建一个实现接口的子类
封装:您可以“包装”外部类,使其成为实现接口的更大类的一部分,并将接口方法传递给内部类。
有时继承不是一种选择(比如当基类是 时sealed
),但在大多数情况下封装应该是可行的。