【问题标题】:Share a private implementation between two classes in C#在 C# 中的两个类之间共享私有实现
【发布时间】:2015-01-31 17:00:19
【问题描述】:

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

  • 公共接口 MyInterface
  • 类 MyCommonImpl : MyInterface
  • 公共类 MyImplA : MyCommonImpl
  • 公共类 MyImplB : MyCommonImpl

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

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

如何在不重复大量代码的情况下做到这一点?

【问题讨论】:

  • 我不太明白这个问题;问题中提出的设计完全有道理。隐藏MyCommonImpl到MyImplA和MyImplB的原因是什么?
  • 我们不想在模块中暴露MyCommonImpl。也就是说,图书馆的用户不应该看到它,因为它成为公共界面的一部分。据我了解,我实际上无法执行上述操作,请使用私有基类继承到公共类。
  • 使用组合,而不是继承 - Wikipedia: Composition over inheritance
  • @LasseV.Karlsen,我已经解释了为什么我不想使用合成。它基本上涉及对代码的复制粘贴,并涉及拦截事件回调。
  • 好吧,你不能创建一个继承自内部类的公共类。

标签: c#


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2012-06-14
    • 2019-08-05
    相关资源
    最近更新 更多