【问题标题】:Override method with generic type signature使用泛型类型签名覆盖方法
【发布时间】:2021-06-22 02:16:42
【问题描述】:

如何使用泛型类型签名覆盖抽象方法,并在子类中为其赋予更具体的参数类型?

type Rule() =
    abstract Core : 'T -> bool
    default _.Core _ = false

type Entity = {
    Name: string
    State: string
}

type Wisconsin() =
    inherit Rule()
    override _.Core (entity: Entity) =
        entity.State = "WI"

SimpleMemberOverload.fsx(256,22):错误 FS0001:此表达式应具有类型 ''一个' 但这里有类型 '实体'

【问题讨论】:

  • 你不能。基类表示该方法接受 any 类型参数。如果您将Wisconsin 作为Rule 传递,则调用Corer 应该适用于任何类型,而不仅仅是Entity
  • 我注意到错误消息中的文件名SimpleMemberOverload.fsx,我想知道是否存在关于重载和覆盖的混淆。这是两个非常不同的东西。

标签: f#


【解决方案1】:

你不能。毕竟,说一个规则接受 any 'T 然后让这样一个规则只接受实体会违反合同。具有Rule 类型的引用指向Wisconsin 类型的对象的调用者应该期待什么,例如string 被传递给Core

但是,您可以像这样定义各种规则:

type Rule<'T> () =
    abstract Core : 'T -> bool
    default _.Core _ = false

type Entity = {
    Name: string
    State: string
}

type Wisconsin() =
    inherit Rule<Entity>()
    override _.Core entity =
        entity.State = "WI"

意思是Wisconsin 没有缩小参数类型,但现在实体的规则。

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多