2011-03-15 5 views
3

빈 생성자와 매개 변수를 허용하는 생성자 오버로드를 가져 와서 공용 속성에 할당하려고합니다. 내가 붙어 곳속성 지정이있는 f #의 다중 생성자

이있다 :`예기치 않은 키워드 '새로운'개체 표현 :

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; 

그것은 나에게 오류를 제공합니다. '멤버', '오버라이드'또는 다른 토큰이 필요합니다.

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

답변

6

당신이 시도해 볼 수도 있습니다 : 나는 member 사용하는 경우

는 재산 TemplateDirectory이 오류를 제공합니다.

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

    new() = TemplateService("") 

    interface ITemplateService with 
     member this.TemplateDirectory = templateDirectory 
+0

할당 전에 'd'가 null 또는 비어 있는지 확인하고 싶습니다. 앞에 오류가 발생하는 경우. –

+0

null 확인을 위해 Daniel이 편집 한 버전을 참조하십시오. –

+0

그러나 나는 단지 arguement를 받아들이는 생성자에 대해서만이 테스트를 할 필요가있다. 'new TemplateService()'를 실행하면 오류가 발생합니다. –

0

불행히도 인터페이스를 사용하고 값을 생성자 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" 
+0

인터페이스 및 일반 액세스를 사용하려면 인터페이스 외부에서 한 번씩 두 번 정의하고 인터페이스 내에서 래퍼를 정의하는 것이 좋습니다. – Guvante

0

당신은 생성자를 인터페이스의 정의에 넣고 있습니다. 이것이 오류의 원인입니다. 또한 get 전용 속성에 값을 저장하려고 시도하는 대신 보조 저장소를 사용해야합니다.

마지막으로 nyinyithann의 버전은 일반적인 F # 스타일 (최소 변경 가능 문자)보다 인라인되어 있기 때문에 nyinyithann의 버전을 사용하는 것이 좋습니다.

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;