Несколько конструкторов в f # с присваиванием свойств - PullRequest
3 голосов
/ 15 марта 2011

Мне нужен пустой конструктор и перегрузка конструктора, которая принимает параметр и присваивает его общедоступному свойству.

Вот где я застрял:

type TemplateService() = 
    interface ITemplateService with

        //Properties
        member TemplateDirectory = ""

        //Constructors
        new (templateDirectory:string) = //Error here.
            if (templateDirectory == null) then
                raise (new System.ArgumentNullException("templateDirectory"))
            TemplateDirectory = templateDirectory;

Это дает мне ошибку: "Неожиданное ключевое слово" new "в выражении Object.Ожидаемый член, переопределение или другой токен.

Если я использую member, свойство TemplateDirectory выдает эту ошибку:

This instance member needs a parameter to represent the object being invoked. Make the member static or use the notation 'member x.Member(args) = ...'

Ответы [ 3 ]

6 голосов
/ 15 марта 2011

Вы можете попробовать это.

type TemplateService(templateDirectory : string) = 
    do
        if templateDirectory = null then nullArg "templateDirectory"

    new() = TemplateService("")

    interface ITemplateService with
        member this.TemplateDirectory = templateDirectory
0 голосов
/ 15 марта 2011

Вы помещаете свой конструктор в определение интерфейса, и это является причиной ошибки. Также вы пытаетесь сохранить значение в свойстве get only, вместо этого вам следует использовать резервное хранилище.

Наконец, я бы порекомендовал версию nyinyithann, поскольку она более встроена в обычный стиль F # (минимальные изменяемые таблицы), просто надеясь дать версию ближе к вашей, если она будет полезна.

type TemplateService() = 
    let mutable directory = ""

    interface ITemplateService with

        //Properties
        member this.TemplateDirectory = directory

    //Constructors
    new (templateDirectory:string) =
        if (templateDirectory = null) then
            raise (new System.ArgumentNullException("templateDirectory"))
        directory <- templateDirectory;
0 голосов
/ 15 марта 2011

К сожалению, если вы хотите использовать интерфейс и передать значение конструктору, nyinyithann ответ правильный. Вы можете установить публичные свойства в вызове конструктора следующим образом.

type TemplateService() = 
    let mutable templateDirectory = ""

    member this.TemplateDirectory
        with get() = templateDirectory
        and set directory = 
            if directory = null then
                raise (new System.ArgumentNullException "templateDirectory")
            templateDirectory <- directory

let template = TemplateService(TemplateDirectory = "root")

Теперь, если вы хотите использовать интерфейс, это не сработает.

type ITemplateService =
     abstract TemplateDirectory : string with get, set

type TemplateService() = 
    let mutable templateDirectory = ""

    interface ITemplateService with
        member this.TemplateDirectory
            with get() = templateDirectory
            and set directory = 
                if directory = null then
                    raise (new System.ArgumentNullException "templateDirectory")
                templateDirectory <- directory

let template = TemplateService(TemplateDirectory = "root") // error

Вы вынуждены использовать эту уродливую вещь.

let template = TemplateService()
(template :> ITemplateService).TemplateDirectory <- "root"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...