【发布时间】:2010-09-30 12:10:46
【问题描述】:
我面临的设计决策对我来说并不陌生,但却让我停下来。看看下面的代码示例:
public interface IGenerator
{
///<summary>
/// Combines two generators; performs magic as well
/// </summary>
BaseGenerator Combine(BaseGenerator next);
///<summary>
/// Does what a generator does.
/// </summary>
object GenerateLolKThx();
}
public abstract class BaseGenerator : IGenerator
{
///<summary>
/// Combines two generators; performs magic as well
/// </summary>
public BaseGenerator Combine(BaseGenerator next)
{
// do stuff that I really don't want implementors to try and do
// because its complex and can result in bad juju if done wrong
return SuperSecretCombine(this, next);
}
///<summary>
/// Does what a generator does.
/// </summary>
public abstract object GenerateLolKThx();
/* other base class methods */
}
我不想更详细地说明为什么我不想使用 Combine 方法信任实现者;足以说明它的复杂性。但是,我确实想尽我所能强迫任何想要实现 IGenerator 的人扩展 BaseGenerator,因为这是正确组合两个生成器的唯一方法。这是由接口本身强制执行的。
我担心我在该接口中引用某个接口的实现会导致出现意外问题(由“气味”表示)。但我也知道这种事情在 CS 中并非闻所未闻,它本身也不是坏事(即描述 XSD 的 XML 模式和用它们编译的语言编写的语言编译器)。
【问题讨论】:
-
请注意,您的方法不能保证使用 your 版本;请参阅我的(更新的)答案,以展示实现如何窃取 Combine() 逻辑,以及如何使用扩展方法方法避免这个陷阱。
标签: .net class design-patterns interface