Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
};<br />
void Insert(Graphic*);<br />
// . . .<br />
Структурные паттерны<br />
Мы можем вставить объект ImageProxy в документ следующим образом:<br />
TextDocument* text = new TextDocument;<br />
// ...<br />
text->Insert(new ImageProxy("anlmageFileName"));<br />
а заместители, использующие метод doesNotUnderstand. В языке Smalltalk<br />
можно создавать обобщенных заместителей, определяя классы, для которых<br />
нет суперкласса 1 , а в них - метод doesNotUnderstand: для обработки сообщений.<br />
В показанном ниже фрагменте предполагается, что у заместителя есть метод<br />
realSubject, возвращающий связанный с ним реальный субъект. При<br />
использовании ImageProxy этот метод должен был бы проверить, создан<br />
ли объект Image, при необходимости создать его и затем вернуть. Для обработки<br />
перехваченного сообщения, которое было адресовано реальному<br />
субъекту, используется метод perf orm: withArguments :.<br />
doesNotUnderstand: aMessage<br />
Л<br />
self realSubject<br />
perform: aMessage selector<br />
withArguments: aMessage arguments<br />
Аргументом doesNotUnderstand: является экземпляр класса Message,<br />
представляющий сообщение, не понятое заместителем. Таким образом, при<br />
ответе на любое сообщение заместитель сначала проверяет, что реальный<br />
субъект существует, а потом уже переадресует ему сообщение.<br />
Одно из преимуществ метода doesNotUnderstand: - он способен выполнить<br />
произвольную обработку. Например, можно было бы создать защищающего<br />
заместителя, определив набор legalMessages-сообщений, которые<br />
следует принимать, и снабдив заместителя следующим методом:<br />
doesNotUnderstand: aMessage<br />
Л<br />
(legalMessages includes: aMessage selector)<br />
ifTrue: [self realSubject<br />
perform: aMessage selector<br />
withArguments: aMessage arguments]<br />
ifFalse: [self error: 'Illegal operator']<br />
Прежде чем переадресовать сообщение реальному субъекту, указанный метод<br />
проверяет, что оно допустимо. Если это не так, doesNotUnderstand:<br />
посылает сообщение error: самому себе, что приведет к зацикливанию,<br />
если в заместителе не определен метод error:. Следовательно, определение<br />
error: должно быть скопировано из класса Object вместе со всеми<br />
методами, которые в нем используются.<br />
Практически для любого класса Object является суперклассом самого верхнего уровня. Поэтому выражение<br />
«нет суперкласса» означает то же самое, что «Object не является суперклассом».