在 C# 中的两个类之间共享私有实现

本文关键字:之间 共享 实现 两个 | 更新日期: 2023-09-27 18:32:51

我正在寻找一种方法来共享两个类的实现,而不会公开该共享的任何细节。 我希望创建这个基本的类结构:

  • 公共接口 我的界面
  • 类 MyCommonImpl : MyInterface
  • 公共类 MyImplA : MyCommonImpl
  • 公共类 MyImplB : MyCommonImpl

MyCommonImpl实现了MyInterface的函数,并在MyImplAMyImplB中提供了一个抽象函数。MyImplA的用户不应该以任何方式了解MyCommonImpl,这只是一个暗示的细节。

我考虑过进行手动合成,但这涉及复制大量代码来转发函数。这也是有问题的,因为有在MyCommonImpl中实现的事件,并且它们的参数之一是sender。这需要放置代理处理程序并部分重写事件。基本上,合成需要更多的代码,而不是简单地复制粘贴整个MyCommonImpl

如何在不必复制大量代码的情况下执行此操作?

在 C# 中的两个类之间共享私有实现

您可以将接口和实现移动到另一个程序集,并将它们标记为内部,这将隐藏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");
        }
    }
}