我有一个离散联合 WordContainer,它是 WordDocument 的 Doc 或 WordTableCell 的 Cell。就该特定功能而言,每种类型在功能方面都具有相同的 API。我使用匹配表达式来确定该值是 Doc 还是 Cell,然后在每种情况下使用具有两个不同变量的相同代码。
我花了一些时间查找此内容并阅读文档以找出如何删除重复项。首先,我认为类型类会很棒,但这些显然对 F# 来说是一个陌生的概念。然后我想也许一个接口可能会很好,但似乎我需要那些使用实际方法的完整类,这极大地复杂了我现在拥有的类型层次结构。尝试将类型保留并解决该问题并没有成功,没想到会成功,但我仍然尝试了。
这里的问题是 和
WordTableCell
提供WordDocument
类似的 API,但不共享基类或接口。这称为“鸭子打字”。解决方案 1:辅助函数
addParagraph
处理此问题的一种方法是通过创建自己的辅助函数来消除差异addTable
:然后您可以像这样调用统一函数:
这基本上是穷人的类型。
解决方案 2:成员
另一个稍微冗长但可能更具可扩展性的解决方案是
WordContainer
通过定义AddParagraph
和AddTable
成员在类型上创建统一的接口:然后你可以这样称呼它们: