dte*_*ech 2 inheritance f# discriminated-union
假设我有一个 DU ,我不能(或不想)改变它:
type OrDU =
| A
| B
| C
Run Code Online (Sandbox Code Playgroud)
现在在另一个程序中,我需要一个 DU,它与上述相同,但需要一些额外的情况。
type ExtraDU =
inherit OrDU
| D
| E
Run Code Online (Sandbox Code Playgroud)
但是,DU 不能扩展。什么是最好的解决方案?理想情况下,我想要简单的互操作,即 aOrDu可以用作 a ExtraDU,并且ExtraDU没有额外情况的an可以转换回 a OrDU。
你可以像这样扩展它:
type ExtraDU =
| OrDU of OrDU
| D
| E
Run Code Online (Sandbox Code Playgroud)
来自http://theburningmonk.com/2012/03/f-extending-discriminated-unions-using-marker-interfaces的另一种方法如下所示:
type IMessage = interface end
type OrDU =
| A | B | C
interface IMessage
type ExtraDU =
| D | E
interface IMessage
let f1 = function
| A -> "A"
| B -> "B"
| C -> "C"
let f2 = function
| D -> "D"
| E -> "E"
let f (msg : IMessage) =
match msg with
| :? OrDU as a -> f1 a
| :? ExtraDU as b -> f2 b
| _ -> failwith "Invalid type"
Run Code Online (Sandbox Code Playgroud)
但是,这需要您通过添加接口来更改 OrDU
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |