Множественные реализации

Главные средства, поддерживающие объектно-ориентированноепрограммирование, а конкретно: производные классы и виртуальные функции,-можно использовать и для поддержки абстракции данных, если допуститьнесколько реализаций 1-го типа. Вернемся например со стеком: template class stack { public: virtual void push ( T ) = 0; // незапятнанная виртуальная функция virtual T pop () = 0; // незапятнанная виртуальная функция }; Обозначение =0 указывает, что для виртуальной Множественные реализации функции не требуетсяникакого определения, а класс stack является абстрактным, т.е. он можетиспользоваться только как базисный класс. Потому стеки можно использовать,но не создавать: class cat { /* ... */ }; stack s; // ошибка: стек - абстрактный класс void some_function ( stack & s, cat kitty ) // нормально { s.push ( kitty ); cat c2 = s.pop (); // ... } Так как Множественные реализации интерфейс стека ничего не докладывает о его представлении, отпользователей стека стопроцентно укрыты детали его реализации. Можно предложить несколько разных реализаций стека. К примеру, стекможет быть массивом: template class astack : public stack { // настоящее представление объекта типа стек // в этом случае - это массив // ... public: astack ( int size ); ~astack (); void push Множественные реализации ( T ); T pop (); }; Можно воплотить стек как связанный перечень: template class lstack : public stack { // ... }; Сейчас можно создавать и использовать стеки: void g () { lstack s1 ( 100 ); astack s2 ( 100 ); cat Ginger; cat Snowball; some_function ( s1, Ginger ); some_function ( s2, Snowball ); } О том, как представлять стеки различных видов, должен волноваться толькотот, кто их Множественные реализации делает (т.е. функция g()), а юзер стека (т.е. авторфункции some_function()) на сто процентов огражден от деталей их реализации.Платой за схожую упругость будет то, что все операции над стекамидолжны быть виртуальными функциями.

Поддержка объектно-ориентированного программирования

Поддержку объектно-ориентированного программирования обеспечиваютклассы вкупе с механизмом наследования, также механизм вызовафункций-членов Множественные реализации зависимо от настоящего типа объекта (дело в том, чтовозможны случаи, когда этот тип неизвестен на стадии трансляции). Особенноважную роль играет механизм вызова функций-членов. Более важнысредства, поддерживающие абстракцию данных (о их мы гласили ранее). Вседоводы в пользу абстракции данных и базирующихся на ней способов, которыепозволяют естественно и прекрасно работать Множественные реализации с типами, действуют и для языка,поддерживающего объектно-ориентированное программирование. Фуррор обоихметодов находится в зависимости от метода построения типов, от того, как онипросты, гибки и эффективны. Способ объектно-ориентированногопрограммирования позволяет определять более общие и гибкиепользовательские типы по сопоставлению с теми, которые получаются, еслииспользовать только абстракцию данных.

Механизм вызова

Основное средство Множественные реализации поддержки объектно-ориентированного программирования- это механизм вызова функции-члена для данного объекта, когда истинныйтип его на стадии трансляции неизвестен. Пусть, к примеру, есть указательp. Как происходит вызов p->rotate(45)? Так как С++ базируется настатическом контроле типов, задающее вызов выражение имеет смысл толькопри условии, что функция rotate Множественные реализации() уже была описана. Дальше, из обозначенияp->rotate() мы лицезреем, что p является указателем на объект некоторогокласса, а rotate должна быть членом этого класса. Как и при всякомстатическом контроле типов проверка правильности вызова нужна для того,чтоб убедиться (как это может быть на стадии трансляции), что типы впрограмме употребляются непротиворечивым Множественные реализации образом. Тем гарантируется,что программка свободна от многих видов ошибок. Итак, транслятору должно быть понятно описание класса, аналогичноетем, что приводились в $$1.2.5: class shape { // ... public: // ... virtual void rotate ( int ); // ... }; а указатель p должен быть описан, к примеру, так: T * p; где T - класс shape либо производный от него класс. Тогда Множественные реализации трансляторвидит, что класс объекта, на который настроен указатель p, действительноимеет функцию rotate(), а функция имеет параметр типа int. Означает,p->rotate(45) корректное выражение. Так как shape::rotate() была описана как виртуальная функция, нужноиспользовать механизм вызова виртуальной функции. Чтоб выяснить, какуюименно из функций rotate следует вызвать, необходимо до вызова получить изобъекта Множественные реализации некую служебную информацию, которая была помещена туда при егосоздании. Как установлено, какую функцию нужно вызвать, допустимcircle::rotate, происходит ее вызов с уже упоминавшимся контролем типа.Обычно в качестве служебной инфы употребляется таблица адресовфункций, а транслятор конвертирует имя rotate в индекс этой таблицы. Сучетом этой таблицы объект типа shape можно представить Множественные реализации так: center vtbl: color &X::draw &Y::rotate ... ... Функции из таблицы виртуальных функций vtbl позволяют правильноработать с объектом даже в тех случаях, когда в вызывающей функциинеизвестны ни таблица vtbl, ни размещение данных в части объекта,обозначенной ... . Тут как X и Y обозначены имена классов, в которыевходят вызываемые функции. Для объекта Множественные реализации circle оба имени X и Y есть circle.Вызов виртуальной функции может быть на самом деле настолько же эффективен, каквызов обыкновенной функции.

Проверка типа

Необходимость контроля типа при воззваниях к виртуальным функциямможет оказаться определенным ограничением для разработчиков библиотек.К примеру, неплохо бы предоставить юзеру класс "стек чего-угодно".Конкретно в Множественные реализации С++ это сделать нельзя. Но, используя шаблоны типа инаследование, можно приблизиться к той эффективности и простотепроектирования и использования библиотек, которые характерны языкам сдинамическим контролем типов. К таким языкам относится, к примеру, языкSmalltalk, на котором можно обрисовать "стек чего-угодно". Рассмотримопределение стека при помощи шаблона типа: template Множественные реализации class stack { T * p; int sz; public: stack ( int ); ~stack (); void push ( T ); T & pop (); }; Не ослабляя статического контроля типов, можно использовать таковой стекдля хранения указателей на объекты типа plane (самолет): stack cs ( 200 ); void f () { cs.push ( new Saab900 ); // Ошибка при трансляции : // требуется plane*, а передан car* cs.push Множественные реализации ( new Saab37B ); // отлично: Saab 37B - на самом // деле самолет, т.е. типа plane cs.pop () -> takeoff (); cs.pop () -> takeoff (); } Если статического контроля типов нет, приведенная выше ошибкаобнаружится только при выполнении программки: // пример динамическое контроля типа // заместо статического; это не С++ Stack s; // стек может хранить указатели на объекты // случайного типа Множественные реализации void f () { s.push ( new Saab900 ); s.push ( new Saab37B ); s.pop () -> takeoff (); // отлично: Saab 37B - самолет cs.pop () -> takeoff (); // динамическая ошибка: // машина не может взлететь } Для метода определения, допустима ли операция над объектом, обычнотребуется больше дополнительных расходов, чем для механизма вызовавиртуальных функций в С++. Рассчитывая Множественные реализации на статический контроль типов и вызов виртуальных функций,мы приходим к иному стилю программирования, чем надеясь только надинамический контроль типов. Класс в С++ задает строго определенныйинтерфейс для огромного количества объектов этого и хоть какого производного класса, тогдакак в Smalltalk класс задает только мало нужное число операций,и юзер вправе Множественные реализации использовать незаданные в классе операции. Инымисловами, класс в С++ содержит четкое описание операций, и пользователюгарантируется, что только эти операции транслятор сочтет допустимыми.
mo-iznoskovskij-rajon-po-realizacii-programmi-obespechenie-zhilem-molodih-semej-po-ukrepleniyu-byudzhetnoj-i.html
mo-ponyatie-formi-i-vidi-otlichie-ot-naselennogo-punkta-dvuhurovnevaya-sistema-mo-v-rf.html
mo-visokovskoe-sposelenie-i-osnovnie-napravleniya-deyatelnosti-muk-rmomc-kulturi-i-iskusstva-v-2011-godu.html