Вы можете сделать что-то вроде этого:
Class>>initializeInstance: anInstance
anInstance instVarNamed: #i put: 1.
anInstance instVarNamed: #j put: 2.
но у вас все еще есть метод инициализации, но теперь он на стороне класса и на самом деле не делает то, что вы хотите. однако .. вы можете попробовать:
Class>>new: params
^super newInstance initializedBy: [ anInstance |
anInstance instVarNamed: #i put: 1.
anInstance someMethodCalledOnInitalization.
]
и на стороне экземпляра:
initializedBy: anInitializationBlock
anInitializationBlock value: self.
Я думаю, что это дает общее представление о том, что вы хотели. Я не думаю, что это стоит затраченных усилий, так как я могу просто использовать instVarNamed и менять свой объект. Соглашение о малом разговоре простое ... никто из внешних источников не должен вызывать что-либо в вашей категории методов инициализации без действительно хорошего понимания того, почему они это делают.
Вы также можете оставить все это на стороне своего класса w:
Class>>new: params
anInstance := super newInstance.
^ self initialize: anInstance using: [ anInstance |
anInstance instVarNamed: #j put: 1.
].
Class>>initialize: anInstance using: aBlock
aBlock value: anInstance.
^ anInstance.