Реализация интерфейса с членом другого интерфейса в Дискриминационном Союзе - PullRequest
0 голосов
/ 22 марта 2019

Я использую Argu для анализа моих аргументов cli. Я заметил, что мне нужны одни и те же аргументы для двух разных вещей. Я хотел бы использовать те же типы и изменить только реализацию интерфейса (IArgParserTemplate в моем аргументе дискриминированного союза).

что-то вроде этого:

type IArgumentDescription =
     abstract member FirstDescription: string

type ImportArguments =
    interface IArgumentDescription with
        member this.FirstDescription = "Import Description"

type ExportArguments =
    interface IArgumentDescription with
        member this.FirstDescription = "Export Description"

type Arguments<'T when 'T :> IArgumentDescription> = | FirstArgument of string
with 
    interface IArgParserTemplate with
        member this.Usage =
            match this with
            | FirstArgument _ -> ? (Here I would like to use the 'T.FirstDescription of the IArgumentDescription Interface. (this:>IArgumentDescription).FirstDescription does not work.)

Возможно ли это даже в FSharp, и если да, каков правильный синтаксис?

1 Ответ

1 голос
/ 22 марта 2019

Я не могу придумать хороший способ сделать это, так как вы не можете по-настоящему параметризировать или «подклассить» дискриминационный союз. Вы могли бы использовать несколько грязный хак с отражением, но я не совсем уверен, что это целесообразно (как и в большинстве случаев, связанных с отражением в рабочем коде).

type IArgParserTemplate =
    abstract member Usage : string


type IArgumentDescription =
     abstract member FirstDescription: string

// The parentheses are important to make this a class, not an interface
type ImportArguments() =
    interface IArgumentDescription with
        member this.FirstDescription = "Import Description"

// The parentheses are important to make this a class, not an interface
type ExportArguments() =
    interface IArgumentDescription with
        member this.FirstDescription = "Export Description"

type Arguments<'T when 'T :> IArgumentDescription> = | FirstArgument of string
with 
    interface IArgParserTemplate with
        member this.Usage =
            // Here's your instance of 'T
            let instance = Activator.CreateInstance<'T>()

            match this with
            | FirstArgument _ -> instance.FirstDescription
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...