我的第一个问题是,这两个第三方组件类是否已密封?他们不是。至少我们有这个。
因此,由于它们没有密封,问题可以通过以下方式解决:
从 2 个第三方类的重合成员中提取一个公共接口。我把它称为“Icommon”。
public interface ICommon
{
string Name
{
get;
}
void DoThirdPartyStuff ();
}
然后创建2个新类; DerivedClass1 和 DerivedClass2 分别继承自 ThirdPartyClass1 和 ThirdPartyClass2。这两个新类都实现了 ICommon 接口,但在其他方面都是空的。
public class DerivedClass1
: ThirdPartyClass1, ICommon
{
}
public class DerivedClass2
: ThirdPartyClass2, ICommon
{
}
现在,即使派生类是空的,基类也满足接口,这是我们首先从中提取接口的地方。
生成的类图如下所示。
替代文本 http://www.freeimagehosting.net/uploads/988cadf318.png
所以现在,而不是我们以前拥有的:
ThirdPartyClass1 c1 = new ThirdPartyClass1 ();
c1. DoThirdPartyStuff ();
我们现在可以这样做:
ICommon common = new DerivedClass1 ();
common. DoThirdPartyStuff ();
对于 DerivedClass2 也可以完成同样的操作。
结果是,我们所有引用 ThirdPartyClass1 实例的现有代码都可以保留原样,只需将 ThirdPartyClass1 引用替换为 ICommon 引用即可。然后,可以为 ICommon 引用提供 DerivedClass1 或 DerivedClass2 的实例,当然,它们又分别继承自 ThirdPartyClass1 和 ThirdPartyClass2。一切都正常。
我不知道这是否有一个特定的名称,但对我来说,它看起来像是适配器模式的变体。
也许我们可以使用 C# 4.0 中的动态类型来解决问题,但这不会带来编译时检查的好处。
我很想知道是否还有其他人有另一种优雅的方法来解决这个问题。