2010-12-17 2 views
2

기본 생성자를 호출하기 전에 기본 생성자가 아닌 다른 생성자에서 일부 작업을 수행하려고합니다. 이 같은 :F # 비정상 아닌 비 기본 생성자

type Foo(a:int,b:int) = 
    let a = a 
    let b = b 
    new(s:string) = 
     //...work here (intermediate let bindings) 
     let _a = ... 
     let _b = ... 
     Foo(_a,_b) 

가능하다면, 어떻게 지금은 그것에 대해 생각 (이 달성 할 수있는,이 C#으로 할 수 있을지조차 확신하지만, 목표는 어떻게 당신이 할 수있는 유사하다 확장 클래스 생성자에서 좋아하는 곳이면 어디에서나 기본 생성자를 호출 할 수 있습니다.하지만 스케치를하고 싶지는 않습니다. 기본 생성자를 연기하기 전에 제 인수를 약간 처리하십시오. 아니면 컴퓨터 화면을 보았을 것입니다. 너무 많은 오늘)?

답변

3

난 당신이 무슨 짓을했는지 모르지만이 나를 위해 작동합니다 또한

type Foo(a:int,b:int) = 
    let a = a 
    let b = b 
    new (s:string) = 
     printfn "some side effect" 
     let _a = s.Length 
     let _b = 1 
     Foo(_a,_b) 

당신이 파생 유형의 기본 생성자를 호출하고 사전 또는 사후 코드 삽입하려는 경우, 여기 구문은 참고입니다 (중괄호 배치에주의하십시오.) :

type DFoo = 
    inherit Foo 

    new (a,b) = 
     printfn "perform some validation here" 
     let c = 0 // or bind stuff 
     { 
      inherit Foo(a,b) 
     } 
    new (s:string) = 
     { 
      inherit Foo(s) 
     } 
     then if s.Length = 0 then printfn "post ctor side effect" 
+0

고마워, 내 눈은 정말 피곤해! 내가 한 짓 알아? 나는'new Foo (s : string)'을 사용하여 non-primary 생성자를 시작했습니다 ... 형식 구문에 너무 많은 변형이 있기 때문에 결코 그럴 수 없습니다. –

+0

이 경우 문법은 정확히 내가 생각했던 것과 똑같은 것으로 밝혀졌지만 (모든 종류의 변형을 시도하고, 검색 한 후 거의 내 코드에서 올바르게 처리 한 다음 입력하는 동안 분명히 올바르게 처리했습니다. 질문을 풀고 가설 적이라고 생각)! –

+0

대부분의 경우 F #은 노이즈를 최소화하려고합니다 (C++ 또는 Java와 비교). 'Foo'는'new Foo'에서 잡음이 될 것이고,'new'만으로는 충분한 신호입니다. – Stringer