인스턴스 변수 'a'가있는 클래스가 있습니다.초기화가 smalltalk에서 언제 호출됩니까?
new를 사용하여 클래스의 새 인스턴스를 만들 때 호출되는 메서드의 순서는 무엇입니까?
개체가 initialize 메서드를 호출해야한다는 것을 어떻게 알 수 있습니까?
인스턴스 변수에 값을 할당하는 클래스 메서드를 만드는 경우에도 내 클래스 메서드에서 호출하지 않는 다른 인스턴스 변수에 대해 초기화가 여전히 호출됩니까?
인스턴스 변수 'a'가있는 클래스가 있습니다.초기화가 smalltalk에서 언제 호출됩니까?
new를 사용하여 클래스의 새 인스턴스를 만들 때 호출되는 메서드의 순서는 무엇입니까?
개체가 initialize 메서드를 호출해야한다는 것을 어떻게 알 수 있습니까?
인스턴스 변수에 값을 할당하는 클래스 메서드를 만드는 경우에도 내 클래스 메서드에서 호출하지 않는 다른 인스턴스 변수에 대해 초기화가 여전히 호출됩니까?
initialize
은 일반적으로 new
메서드 자체에서 호출됩니다.
new
^self basicNew initialize
#basicNew
그냥 객체를 생성하지만 초기화하지 않습니다하는 원시적이다. 모든 인스턴스 변수는 basicNew 뒤에 nil이됩니다.
Smalltalk의 모든 구현에서 initialize 메소드가 자동으로 호출되지는 않지만 (어떤 메소드가이를 수행하지 않는지는 알 수 없음) 제대로 이식되기를 원하면 클래스에 #new
을 무시해야합니다 명시 적으로 호출 할 수 있습니다.
스튜어트가 완벽하게 대답했습니다. 그러나 두 번째 질문에 여전히 의문이있는 경우 :
클래스 메서드를 만들어 인스턴스 변수에 값을 할당하면 내 클래스 메서드에서 호출하지 않는 다른 인스턴스 변수에 대해 초기화가 여전히 호출됩니까?
당신은 (스튜어트의 대답으로 설명) #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
첫번째 당신의 초기화 메서드가 호출되고 이후생성자 매개 변수 메서드이 호출됩니다.
클래스 (객체 A)는 인스턴스 (다른 객체 B)에 직접 쓸 수 없습니다. A에 대한 유일한 방법은 B에게 메시지를 보내는 것입니다. 모든 경우에 A는 먼저 B를 만든 다음 제대로 초기화해야합니다. 나를위한 생성자는 원자 적으로 두 개의 연산 (생성 + 초기화)을 수행하는 것입니다. 새로운 보내기가 초기화 될 때 unitialized basicNew가 숨겨져 있으므로 적절한 생성자의 환상을 유지할 수 있습니다. x : y와 같은 다른 메시지에 대해 두 번 초기화하지 않으려면 Point BasicNew setX : y :를 보내십시오. Point의 경우 Integer >> @는 원시이고 따라서 원자입니다. –
예, 아마도 스몰 토크 켄트 벡이 * 스몰 토크 모범 사례 패턴을 작성할 때 사용했을 것입니다 * 디폴트로 # # new를 통해 # 초기화를 호출하지 않았습니다. – MartinW