我正在寻找一种方法来共享两个类的实现,而不会暴露该共享的任何细节。我希望创建这个基本的类结构:
MyCommonImpl
实现了MyInterface
的功能,并在MyImplA
和MyImplB
中提供了一个抽象功能。 MyImplA
的用户不应该以任何方式了解MyCommonImpl
,这只是一个实施细节。
我考虑过手动编写,但这涉及复制大量代码以转发函数。这也是有问题的,因为在MyCommonImpl
中实施了一些事件,其中一个参数是sender
。这需要放置代理处理程序并部分重写事件。基本上,组合需要的代码多于简单地复制粘贴整个MyCommonImpl
。
如何在不复制大量代码的情况下完成此操作?
答案 0 :(得分:0)
您可以将接口和实现移动到另一个程序集并在内部标记它们,这将隐藏MyCommonImpl的抽象功能。更进一步,您可以显式实现该程序集中的接口,以完全隐藏其来自调用者的方法,只留下MyImplA上声明为public的那些方法。
显式实现的内部强制转换虽然有点令人讨厌......
在另一个集会中:
namespace Private
{
internal interface IMyInterface
{
void InterfaceMethod();
}
public abstract class MyCommonImpl : IMyInterface
{
internal MyCommonImpl()
{
// internal ctor to stop callers constructing
}
void IMyInterface.InterfaceMethod()
{
Console.WriteLine("InterfaceMethod");
}
internal abstract void CommonAbstract();
}
public class MyImplA : MyCommonImpl
{
internal override void CommonAbstract()
{
((IMyInterface)this).InterfaceMethod();
Console.WriteLine("CommonAbstract");
}
public void ImplAMethod()
{
CommonAbstract();
Console.WriteLine("ImplAMethod");
}
}
}