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 />
виртуальными функциями.