09.04.2016 Views

Priemioop

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ак решать задачи проектирования<br />

бъекта - множеству запросов, на которые объект отвечает. У объекта может быть<br />

ного типов, и объекты разных классов могут иметь один и тот же тип.<br />

Разумеется, между классом и типом есть тесная связь. Поскольку класс опреляет,<br />

какие операции может выполнять объект, то заодно он определяет и его<br />

п. Когда мы говорим «объект является экземпляром класса», то подразумеваем,<br />

то он поддерживает интерфейс, определяемый этим классом.<br />

В языках вроде C++ и Eiffel классы используются для специфицирования,<br />

па и реализации объекта. В программах на языке Smalltalk типы переменных не<br />

бъявляются, поэтому компилятор не проверяет, что тип объекта, присваиваемопеременной,<br />

является подтипом типа переменной. При отправке сообщения<br />

еобходимо проверять, что класс получателя реализует реакцию на сообщение,<br />

о проверка того, что получатель является экземпляром определенного класса,<br />

е нужна.<br />

Важно также понимать различие между наследованием класса и наследованиинтерфейса<br />

(или порождением подтипов). В случае наследования класса реазация<br />

объекта определяется в терминах реализации другого объекта. Проще<br />

воря, это механизм разделения кода и представления. Напротив, наследование<br />

нтерфейса (порождение подтипов) описывает, когда один объект можно испольвать<br />

вместо другого.<br />

Две эти концепции легко спутать, поскольку во многих языках явное разлие<br />

отсутствует. В таких языках, как C++ и Eiffel, под наследованием понимается<br />

новременно наследование интерфейса и реализации. Стандартный способ реазации<br />

наследования интерфейса в C++ - это открытое наследование классу,<br />

котором есть исключительно виртуальные функции. Истинное наследование<br />

терфейса можно аппроксимировать в C++ с помощью открытого наследования<br />

страктному классу. Истинное наследование реализации или класса аппроксимиется<br />

с помощью закрытого наследования. В Smalltalk под наследованием пониается<br />

только наследование реализации. Переменной можно присвоить экземплялюбого<br />

класса при условии, что они поддерживают операции, выполняемые над<br />

ачением этой переменной.<br />

Хотя в большинстве языков программирования различие между наследоваием<br />

интерфейса и реализации не поддерживается, на практике оно существует.<br />

рограммисты на Smalltalk обычно предпочитают считать, что подклассы - это<br />

одтипы (хотя имеются и хорошо известные исключения [Соо92]). Программисна<br />

C++ манипулируют объектами через типы, определяемые абстрактными<br />

ассами.<br />

Многие паттерны проектирования зависят от этого различия. Например, объты,<br />

построенные в соответствии с паттерном цепочка обязанностей, должны<br />

еть общий тип, но их реализация обычно различна. В паттерне компоновщик<br />

дельный объект (компонент) определяет общий интерфейс, но реализацию чао<br />

определяет составной объект (композиция). Паттерны команда, наблюдаль,<br />

состояние и стратегия часто реализуются абстрактными классами с исклютельно<br />

виртуальными функциями.

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

Saved successfully!

Ooh no, something went wrong!