F#实现抽象类属性时出现FS0556、FS0554错误的原因咨询
问题分析与修复
你的代码报错主要有几个问题,逐个解决:
重写抽象成员要用
override而非member
你继承了抽象类V<'D>,要实现它的抽象属性Preds,必须用override关键字,而不是普通的member。属性多写了冗余的泛型参数
PV<'D>已经声明了泛型参数'D,所以属性Preds后面的<''D>完全多余,直接写Preds就行。属性类型笔误
抽象类里的属性类型是V<'V> list,你写的Vertex<'D> list应该是笔误,改成V<'D> list。类型注解位置不符合语法要求
按照错误提示,属性getter/setter的类型注解要紧跟在get()/set(_)后面,不过这里因为返回类型能通过Utils.impossible推断,甚至可以省略类型注解,要写的话得放在正确位置。
修复后的代码:
module Test = type VD(id : int) = member this.id = id [<AbstractClass>] type V<'V when 'V :> VD>(v : 'V option) = abstract member Preds : V<'V> list with get type PV<'D when 'D :> VD>(v : 'D option) = inherit V<'D>(v) override _.Preds : V<'D> list with get() = Utils.impossible<V<'D> list>() // 抽象类里只定义了getter,不需要setter可以删掉该行,否则要先在抽象类声明set and set(_) = Utils.impossible<unit>()
额外提醒:原抽象类V<'V>只声明了Preds的getter,如果你在子类里加setter,需要先在抽象类里把Preds声明为with get, set,否则子类不能额外添加setter,会触发新错误。不需要setter的话,直接删掉and set(_)...那一行即可。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

