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