【发布时间】:2015-01-24 00:11:33
【问题描述】:
我想定义一个可区分联合的所有成员共享的方法。目前我已经像这样实现了它,但它看起来真的很不雅 - 当然有更好的方法。有什么建议吗?
type A =
{AData:string}
member this.SharedMethod (x:float) : int= ...
type B =
{BData:float}
member this.SharedMethod (x:float) : int= ...
type AB =
| A of A
| B of B
let CallSharedMethod (ab:AB) x =
match ab with
| AB.A(a') -> a'.SharedMethod x
| AB.B(b') -> b'.SharedMethod x
【问题讨论】:
-
您缺少实例绑定,即:this.SharedMethod,否则将无法正常工作。此外,您还需要添加更多关于您的共享方法与 DU 实例(实际上是记录类型)有何作用的信息,因为如果它什么都不做,您可以使用常规函数。我确定不是你的情况。
-
在我看来这种方法应该在 DU 上。但如果没有,你可以使用记录来实现一个接口。
-
是的,很抱歉我的代码在语法上并不完全正确。我对模式更感兴趣——我如何表示 DU 的每个子类型共享一个通用方法名称这一事实?我将编辑代码以使其更正确。
-
好的,我可以把CallSharedMethod设为AB的方法。但我仍然需要进行模式匹配。您的其他建议 - 将记录作为界面似乎是最好的选择。我会试试这个。
-
如果您希望每个 DU 案例都表现相同,您就没有歧视。 :)
标签: inheritance f# discriminated-union