设计问题 - 继承是简化此代码的正确方法吗?

Cri*_*onX 7 c# inheritance design-patterns

我有一个我想解决的设计问题.我有一个接口,让我们调用它IProtocol,它由两个单独的类实现.我们在这里查看600多行代码.他们所做的绝大多数事情是相同的,除了一些特定的领域,比如DiffStuff();

目前的结构是这样的:

public class Protocol1 : IProtocol
{
  MyInterfaceMethod1()
  {
     Same1();
     DiffStuff();
     Same2();
  }
}
Run Code Online (Sandbox Code Playgroud)

public class Protocol2 : IProtocol
{
  MyInterfaceMethod1()
  {
     Same1();
     Same2();
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我将两个协议分开,我关心的是复制粘贴错误和代码重复的经典问题.我们讨论的是每行600行代码,而不是一些简单的方法.

我正在考虑将Protocol1的实现改为继承自protocol2,就像这样(Protocol2基本上保持不变,除了我必须包装Same1()Same2()进入私有方法.)

public class Protocol1 : Protocol2
{
  void Same1()
  {
     base.Same1();
  }

  void Same2()
  {
     base.Same2();
  }

  MyInterfaceMethod1()
  {
     Same1();
     DiffStuff();
     Same2();
  }
}  
Run Code Online (Sandbox Code Playgroud)

这是处理这个问题的正确方法吗?

编辑: 很多人帮助我解决了这个问题,感谢您的明确理解.在我的例子中,两个对象的类型不同,即使它们的大部分实现都是共享的,所以我采用了Bobby的建议来使用抽象基类,创建小方法来封装类之间的变化.另外感谢:

  • jloubert
  • 汉斯帕斯特
  • 杰夫索姆

Bla*_*de3 7

    /// <summary>
    /// IProtocol interface
    /// </summary>
    public interface IProtocol
    {
        void MyInterfaceMethod1();
        void Same1();
        void Same2();
    }
Run Code Online (Sandbox Code Playgroud)

然后...

public abstract class ProtocolBase : IProtocol
{
    #region IProtocol Members

    public void MyInterfaceMethod1()
    {
        // Implementation elided...
    }

    public void Same1()
    {
        // Implementation elided...
    }

    public void Same2()
    {
        // Implementation elided...
    }

    public abstract void DiffStuff();

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

最后...

public sealed class Protocol1 : ProtocolBase
{
    public override void DiffStuff()
    {
        // Implementation elided...
    }
}

public sealed class Protocol2 : ProtocolBase
{
    public override void DiffStuff()
    {
        // Implementation elided...
    }
}
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 5

不完全的.添加Same1和Same2方法没有意义,您可以从ProtocolBase继承它们.并且DiffStuff()应该是一个虚方法,以便您可以覆盖它并赋予它不同的行为.