在 C# 中的两个类之间共享私有实现
本文关键字:之间 共享 实现 两个 | 更新日期: 2023-09-27 18:32:51
我正在寻找一种方法来共享两个类的实现,而不会公开该共享的任何细节。 我希望创建这个基本的类结构:
- 公共接口 我的界面
- 类 MyCommonImpl : MyInterface
- 公共类 MyImplA : MyCommonImpl
- 公共类 MyImplB : MyCommonImpl
MyCommonImpl
实现了MyInterface
的函数,并在MyImplA
和MyImplB
中提供了一个抽象函数。MyImplA
的用户不应该以任何方式了解MyCommonImpl
,这只是一个暗示的细节。
我考虑过进行手动合成,但这涉及复制大量代码来转发函数。这也是有问题的,因为有在MyCommonImpl
中实现的事件,并且它们的参数之一是sender
。这需要放置代理处理程序并部分重写事件。基本上,合成需要更多的代码,而不是简单地复制粘贴整个MyCommonImpl
。
如何在不必复制大量代码的情况下执行此操作?
您可以将接口和实现移动到另一个程序集,并将它们标记为内部,这将隐藏MyCommonImpl的抽象函数。更进一步,您可以显式实现该程序集内的接口,以完全隐藏其方法,不让调用者看到那些在MyImplA上声明为公共的方法。
显式实现的内部强制转换有点讨厌......
在单独的程序集中:
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");
}
}
}