2013-09-27 2 views
3

인스턴스 변수 'a'가있는 클래스가 있습니다.초기화가 smalltalk에서 언제 호출됩니까?

new를 사용하여 클래스의 새 인스턴스를 만들 때 호출되는 메서드의 순서는 무엇입니까?

개체가 initialize 메서드를 호출해야한다는 것을 어떻게 알 수 있습니까?

인스턴스 변수에 값을 할당하는 클래스 메서드를 만드는 경우에도 내 클래스 메서드에서 호출하지 않는 다른 인스턴스 변수에 대해 초기화가 여전히 호출됩니까?

답변

7

initialize은 일반적으로 new 메서드 자체에서 호출됩니다.

나는 표준 구현이라고 생각 :

new 
    ^self basicNew initialize 

#basicNew 그냥 객체를 생성하지만 초기화하지 않습니다하는 원시적이다. 모든 인스턴스 변수는 basicNew 뒤에 nil이됩니다.

Smalltalk의 모든 구현에서 initialize 메소드가 자동으로 호출되지는 않지만 (어떤 메소드가이를 수행하지 않는지는 알 수 없음) 제대로 이식되기를 원하면 클래스에 #new을 무시해야합니다 명시 적으로 호출 할 수 있습니다.

1

스튜어트가 완벽하게 대답했습니다. 그러나 두 번째 질문에 여전히 의문이있는 경우 :

클래스 메서드를 만들어 인스턴스 변수에 값을 할당하면 내 클래스 메서드에서 호출하지 않는 다른 인스턴스 변수에 대해 초기화가 여전히 호출됩니까?

당신은 (스튜어트의 대답으로 설명) #initialize#new에서 보낸 Pharo, 예를 들면 켄트 벡 (Kent Beck)의 생성자 매개 변수 방법 관용구 같은 것을 사용하는 경우 :

다음
Point class>>x: xNumber y: yNumber 
    ^self new 
     setX: xNumber 
     y: yNumber 

Point>>setX: xNumber y: yNumber 
    x := xNumber. 
    y := yNumber. 
    ^self 

첫번째 당신의 초기화 메서드가 호출되고 이후생성자 매개 변수 메서드이 호출됩니다.

+1

클래스 (객체 A)는 인스턴스 (다른 객체 B)에 직접 쓸 수 없습니다. A에 대한 유일한 방법은 B에게 메시지를 보내는 것입니다. 모든 경우에 A는 먼저 B를 만든 다음 제대로 초기화해야합니다. 나를위한 생성자는 원자 적으로 두 개의 연산 (생성 + 초기화)을 수행하는 것입니다. 새로운 보내기가 초기화 될 때 unitialized basicNew가 숨겨져 있으므로 적절한 생성자의 환상을 유지할 수 있습니다. x : y와 같은 다른 메시지에 대해 두 번 초기화하지 않으려면 Point BasicNew setX : y :를 보내십시오. Point의 경우 Integer >> @는 원시이고 따라서 원자입니다. –

+0

예, 아마도 스몰 토크 켄트 벡이 * 스몰 토크 모범 사례 패턴을 작성할 때 사용했을 것입니다 * 디폴트로 # # new를 통해 # 초기화를 호출하지 않았습니다. – MartinW

관련 문제