09.04.2016 Views

Priemioop

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 не является суперклассом».

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!