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