【发布时间】:2010-08-23 20:37:54
【问题描述】:
我想解决一个设计问题。
我有一个接口,我们称之为IProtocol,它由两个单独的类实现。我们在这里查看超过 600 行代码。他们所做的绝大多数事情都是一样的,除了对于某些特定领域,比如DiffStuff();
目前的结构是这样的:
public class Protocol1 : IProtocol
{
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
和
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();
}
}
这是解决这个问题的正确方法吗?
编辑: 很多人帮助我解决了这个问题,感谢您的清晰理解。在我的例子中,这两个对象不是同一类型,尽管它们的大部分实现是共享的,所以我使用Bobby's suggestion 使用抽象基类,创建小方法来封装类之间的更改。额外感谢:
- jloubert
- 汉斯·帕桑特
- 杰夫·斯特恩
【问题讨论】:
-
为什么不使用一个抽象类来定义共享方法和未实现的必要方法的抽象定义?
-
看看 Robet C. Martin 的“清洁代码”
-
你应该只让
Protocol1从Protocol2继承,如果这真的有意义的话。你需要问,“每个协议 1 是否也是协议 2 的一个实例,就像每只猫都是哺乳动物一样?”如果是,那么就按照你的想法去做。如果没有,我会使用抽象基类,如 Bobby 的回答所示。
标签: c# design-patterns inheritance