Cri*_*onX 7 c# inheritance design-patterns
我有一个我想解决的设计问题.我有一个接口,让我们调用它IProtocol,它由两个单独的类实现.我们在这里查看600多行代码.他们所做的绝大多数事情是相同的,除了一些特定的领域,比如DiffStuff();
目前的结构是这样的:
public class Protocol1 : IProtocol
{
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
Run Code Online (Sandbox Code Playgroud)
和
Run Code Online (Sandbox Code Playgroud)public class Protocol2 : IProtocol { MyInterfaceMethod1() { Same1(); Same2(); } }
如果我将两个协议分开,我关心的是复制粘贴错误和代码重复的经典问题.我们讨论的是每行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的建议来使用抽象基类,创建小方法来封装类之间的变化.另外感谢:
/// <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)