Переопределение метода с сигнатурой универсального типа

#f#

Вопрос:

Как я могу переопределить абстрактный метод с помощью сигнатуры универсального типа и придать ему более конкретный тип параметра в подклассе?

 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: Ожидалось, что это выражение будет иметь тип
«а»
но здесь есть тип
«Сущность»

Комментарии:

1. Ты не можешь. Базовый класс говорит, что метод принимает любой параметр типа. Если вы проходите Wisconsin как a Rule , вызов Corer должен работать с любым типом, а не просто Entity .

2. Я заметил имя файла SimpleMemberOverload.fsx в сообщении об ошибке, и мне интересно, есть ли путаница с перегрузкой и переопределением. Это две совершенно разные вещи.

Ответ №1:

Вы не можете. В конце концов, сказать, что правило принимает любое «Т», а затем ввести такое правило, в котором участвуют только юридические лица, нарушило бы контракт. Что должен ожидать вызывающий объект, имеющий ссылку типа Rule , указывающую на объект типа Wisconsin , если, например string , передается Core a ?

Однако вы можете определить различные правила следующим образом:

 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 не сужает тип параметра, но теперь это правило для/сущностей.