何时在具体类中隐藏继承层次结构?

6
每当我面临一个工厂根据某些“低级”类型参数(如协议或外部资源的格式)返回抽象基类实现给用户的情况时,我总是想将抽象类转换为具体类,并使用内部“策略工厂”,以便用户可以直接将实现类型传递给构造函数并直接使用基类。

我注意到.Net框架选择以这种方式实现Socket(而不是创建DatagramSocket,您可以在构造时传递SocketType)。决定何时将层次结构平铺为单个具体类的一些指南是什么?

2个回答

3
我认为关键在于:“客户端应该了解多少低级细节?” 如果您选择第一种解决方案(抽象基类),则会向客户端隐藏更多的细节。这样,客户端可以完全忽略低级细节(协议、外部资源的格式)。当目标是完全隐藏实现细节和实现中使用的类型时,我更喜欢这种方法。否则,如果客户端已经了解某些低级实现细节(例如客户端知道他将使用的套接字是UDP,他也想知道这种信息),则可以用内部“策略工厂”替换抽象基类方法。

2
在“优先使用组合而非继承”的精神下,我总是选择策略+工厂方法来代替继承。这给了我几个优点: * 大多数情况下,每个策略都可以在不考虑将使用它的类的情况下进行独立测试。 * 同样地,客户端类可以使用模拟策略进行测试。 * 策略可以被设计成可组合的,例如使用装饰器模式,这样可以提供很大的灵活性,而不会导致子类的爆炸。
总之,如果所有子类的外部语义相同(应该如此),请遵循策略路线。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接