从抽象类重写类型签名

时间:2013-11-13 11:48:23

标签: f# override abstract-class

我对通用过滤器有以下类定义。 根据功能原则,我想有一个更新过滤器并返回Filter类型的新对象的函数。这将允许我在不解决可变性的情况下操作更新

[<AbstractClass>]
type Filter<'T, 'a> (filterState: 'T) =
    let FilterState = filterState
    abstract member Update: 'a -> Filter<'T, 'a>
    abstract member GetState: unit -> 'T

然后我有一个专门的实现:

type LKF (filterState: GenericMatrix, a: GenericMatrix, p: GenericMatrix, q: GenericMatrix, r: GenericMatrix, h: GenericMatrix) =
    inherit Filter<GenericMatrix, GenericMatrix> (filterState)
    let A = a
    let P = p
    let Q = q
    let R = r
    let H = h

    override this.Update(obsVector: GenericMatrix) =
        [... do calculations here] 
        new LKF(newx, A, P, Q, R, H)        

    override this.GetState() =
        filterState

问题是编译器将new LKF(newx, A, P, Q, R, H)标记为错误,因为根据抽象类中的类型签名,它期望返回值为Filter<'T, 'a>,但它得到{{1相反。我认为应该没问题,因为LKFLKF的子类型,但我错了。

我该如何解决这个问题? 谢谢!

1 个答案:

答案 0 :(得分:3)

F#不会隐式转换/转换/强制(尽管存在flexible types)。你必须明确地施展它:

 new LKF(newx, A, P, Q, R, H) :> Filter<_, _>

注意:>运算符:这就是所谓的静态强制转换,它在编译时执行。

<强>更新

它可以更简单,如评论new LKF(newx, A, P, Q, R, H) :> _

中所建议的那样