В настоящей спецификации CLR говорится, что интерфейсы реализованы только для объектов экземпляров и не применяются к самим типам.
C# 8 содержит предложение по определению элементов интерфейса stati c, но необходимо предоставить реализацию методов stati c в самом определении интерфейса. Таким образом, вы не сможете реализовать FromJson
метод для каждого класса.
Если вы попробуете это в F #, вы получите:
FS0868: Интерфейсы не могут содержать определения конкретных членов. Вам может потребоваться определить конструктор для вашего типа, чтобы указать, что тип является классом.
Одним из решений этой проблемы является использование stati c ограничений типа . Они позволяют вам искать существование метода для типа.
let inline create< ^T when ^T : (static member FromJson: string -> ^T)> json =
(^T : (static member FromJson: string -> ^T) (json))
Это поддерживает любой тип, имеющий метод c stati FromJson
с сигнатурой string -> T
.
type Number(num: double) =
member _.Value = num
static member FromJson (json) = new Number(Double.Parse(json))
и использовать:
create<Number> "1.5" //creates a Number(1.5)