1
7
这是最近关于番石榴邮件列表的讨论-我的回答涉及到这个,相当基本的问题。 http://groups.google.com/group/guava-discuss/browse_thread/thread/2d422600e7f87367/1e6c6a7b41c87aac 其要点是: 当您希望包装对象时,不要使用标记接口 . (好吧,这很一般-怎么说 你知道你的对象不会被客户包装吗?)
如果你只有一个标记接口的话,这个工作“很好”!但是如果包装的对象可以序列化呢?如果它是,比如说,“不可变的”(假设你有一个类型来表示它)?还是同步的(同样的假设)。
正如我在对邮件列表的回答中所指出的那样,这种设计缺陷也表现在旧版本中
适当地
编辑:
应该注意的是,我使用枚举只是为了方便。可以通过接口
因此,当你包装一个这样的对象时,你会得到一组功能,你可以很容易地做出决定 . 做 显然,它有它的缺点,所以它只在您真正感受到包装器隐藏表示为标记接口的功能的痛苦的情况下使用。例如,假设您编写了一段接受列表的代码,但它必须是随机访问的 可序列化。按照通常的方法,这很容易表达:
编辑: 另一个缺点是,没有明确的 类型 对于每个功能,我们没有合适的位置来放置表示此功能所提供内容的方法。这在讨论中不太重要,因为我们讨论的是 标记 接口,即不通过其他方法表达的功能,但我提到它是为了完整性。 PS:顺便说一句,如果你浏览一下Guava的collections代码,你会真正感受到这个问题所带来的痛苦。是的,一些优秀的人正试图把它隐藏在美好的抽象背后,但是潜在的问题仍然是痛苦的。 |
2
5
其实现如下所示:
这就是我的工作方式
|
3
1
|
4
1
微软烘焙
aggregation
(
Wikipedia
)组件对象模型(COM)。大多数人似乎都没有使用它,但对COM对象实现者来说却造成了相当大的复杂性,因为每个对象都必须遵守一些规则。包装对象是通过让包装对象知道它们是包装器来封装的,必须维护一个指向包装器的指针,这是在实现QueryInterface(松散地)时使用的
我还没有看到一个干净、易于理解/实现和正确封装的解决方案。COM聚合可以工作并提供完整的封装,但这是您为实现的每个对象支付的成本,即使它从未在聚合中使用。 |
Jivan · 使用mypy在Python中强制合成 2 年前 |
woockashek · Java中同一类的继承和组合 7 年前 |
Sepehr Sobhani · 函数Ramda在范围外传递函数参数 7 年前 |
M. Pilarczyk · 如何确保合成方法的安全? 8 年前 |
daign · 在JavaScript中混合作为对象本身的对象属性 8 年前 |
arjacsoh · 当不允许多重继承时,如何避免代码重复? 10 年前 |