Generics 如何为某些类型通用的几个接口编写包装器类型
我想为不同类型编写一些通用代码,并为其创建一个基类型。它的类型实现了一些通用代码需要的接口。这是一种方式还是不适合f#型模型Generics 如何为某些类型通用的几个接口编写包装器类型,generics,f#,Generics,F#,我想为不同类型编写一些通用代码,并为其创建一个基类型。它的类型实现了一些通用代码需要的接口。这是一种方式还是不适合f#型模型 type IInterface1 = abstract member id :string type IInterface2 = abstract member weight :float type A (id, weight) = interface IInterface1 with member x.id = id interfa
type IInterface1 =
abstract member id :string
type IInterface2 =
abstract member weight :float
type A (id, weight) =
interface IInterface1 with member x.id = id
interface IInterface2 with member x.weight = weight
type B (id, weight) =
interface IInterface1 with member x.id = id
interface IInterface2 with member x.weight = weight
type Common<'T when 'T :> IInterface1 and 'T :> IInterface2> (o :'T) =
interface IInterface1 with member x.id = o.id
interface IInterface2 with member x.weight = o.weight
type LBranch<'T> (root :'T) =
member val root = root
member val branch = [root] :'T list with get, set
member x.add item = x.branch <- item :: x.branch; x
member x.head = match x.branch with h :: _ -> h | _ -> failwith "LevelingTree corrupt"
let a, b = A("1", 10.0), B("2", 100.0)
let ca, cb = Common(a), Common(b)
LBranch(ca).add(cb) // Common<B> is not compatible with Common<A>
一个真正简单的解决方案是让复杂接口继承基本接口,即
type IInterface1 =
abstract member id :string
type IInterface2 =
abstract member weight :float
type ICommon =
inherit IInterface1
inherit IInterface2
另见
type IInterface1 =
abstract member id :string
type IInterface2 =
abstract member weight :float
type ICommon =
inherit IInterface1
inherit IInterface2