-
Язык C++ – мощный инструмент разработки программ, оказавший огромное влияние на развитие вычислительной науки. Управляемые (managed) расширения от Microsoft добавили в язык C++ целый новый мир – мир .NET.
-
Есть четыре общедоступных метода экземпляров класса Object (Объект), три из которых являются виртуальными и часто подменяются в управляемых классах. | Метод Equals (Равняется) | public: virtual bool Equals(Object*); | // виртуальный логический (булев) Равняется (Объект *);
-
Защищенными являются два метода класса Object (Объект). Эти методы могут использоваться только производными классами. | Метод MemberwiseClone | protected: Object* MemberwiseClone(); // защищенный | Данный метод создает поверхностную (shallow) копию объекта.
-
Для иллюстрации описанных методов рассмотрим класс Customer (Клиент) до и после перегрузки методов Equals (Равняется), ToString и GetHashCode. | Стандартные методы класса object (Объект) | Если не произвести подмены виртуальных методов объекта Object (Объект), наш класс будет наследовать стандартное поведение. Это поведение продемонстрировано в CustomsrObjectXStepl.
-
Библиотека классов NET Framework предлагает широкий выбор классов для работы с коллекциями объектов. Все эти классы находятся в пространстве имен System::Collections (Система::Коллекции) и реализуют ряд различного типа коллекций, в том числе списки, очереди, массивы, стеки и хэш-таблицы В коллекциях содержатся экземпляры класса Object (Объект).
-
Концепция интерфейсов – одна из основных в современном программировании. Большие системы неизбежно разделяются на части, и существенным становится вопрос о взаимодействии этих частей друг с другом. Правила такого взаимодействия должны быть строго определены и постоянны, так как их изменение может повлиять на несколько частей системы.
-
Объектно-ориентированное программирование – мощная методология, помогающая в проектировании и реализации больших программных систем. Использование классов позволяет применять обобщение (абстракцию) и инкапсуляцию.
-
Использование интерфейсов облегчает программирование на управляемом C++. Интерфейсы реализуются через классы, и для получения указателя на интерфейс можно выполнить приведение указателя на класс. Методы интерфейсов можно вызывать, используя и указатели на класс, и указатели на интерфейс;
-
Полезной особенностью интерфейсов является возможность их использования в динамических сценариях, что позволяет по ходу выполнения программы проверять, поддерживается ли интерфейс определенным классом. Если интерфейс поддерживается, мы можем воспользоваться предоставляемыми им возможностями;
-
Попытаемся применить полученные знания об интерфейсах для небольшой переделки программы Бюро путешествий Acme (Acme Travel Agency). Одним из наибольших достоинств интерфейсов является то, что благодаря им повышается уровень абстракции, – это позволяет понять и ощутить систему на уровне взаимодействия ее отдельных частей, абстрагируясь от конкретной их реализации.
-
При использовании интерфейсов может возникать неопределенность в случае, если в двух реализованных классом интерфейсах есть методы с одинаковыми именами и сигнатурами. Просмотрим, например, следующие версии интерфейсов lAccount и IStatement.
-
Теперь, достаточно подробно обсудив концепцию интерфейсов, мы можем обратить более пристальный взгляд на коллекции, в частности, на класс ArrayList (Список массивов), который мы активно использовали в программе Бюро путешествий Acme (Acme Travel Agency).
-
Иногда бывает необходимо сделать копию объекта. Если при этом копируются объекты, которые содержат другие объекты или указатели на них, то для корректной реализации этого процесса необходимо понимать его особенности.
-
Итак, мы подробно рассмотрели копирование объектов. Теперь рассмотрим сравнение объектов. Для сравнения объектов в .NET Framework используется интерфейс IComparable. В этом разделе мы в качестве примера воспользуемся интерфейсом IComparablе для сортировки массива.
-
Наши примеры предполагают использование некоего каркаса приложений. Такой каркас – это больше, чем просто библиотека. При использовании библиотеки вы можете вызывать в своих программах библиотечные функции.
-
В управляемом C++ делегат объявляется с помощью особого обозначения – ключевого слова _delegate (делегат) – и сигнатуры инкапсулированного метода. В соответствии с соглашением об именовании, имя делегата должно заканчиваться буквосочетанием "Callback".
-
Синтаксис "вызова" делегата совпадает с синтаксисом вызова метода. Делегат не является сам по себе методом, но он инкапсулирует метод. Делегат "передает" вызов инкапсулированному методу, потому и называется делегатом (от англ, delegate – поручать, уполномочивать).
-
Программа DelegateAccount иллюстрирует использование делегатов на примере банковского счета. В файле DelegateAccount.cpp объявляется делегат NotifyCallback. Методы, соответствующие по сигнатурам методам, описанным в объявлении делегата, реализованы в классе DelegateAccount.
-
Для дальнейшего знакомства с использованием делегатов рассмотрим пример моделирования фондовой биржи, реализованный в папке stockMarket. Модель состоит из двух модулей: | Модуль Admin (Управляющий модуль) предоставляет пользовательский интерфейс для конфигурирования и запуска модели.
-
Делегаты – основа более сложного протокола обратного вызова, называемого событиями. Согласно замыслу, сервер реализует входящие интерфейсы, которые могут быть вызваны клиентом. На диаграммах подобный интерфейс можно обозначить с помощью маленького кружка (обозначение, использующееся в модели компонентных объектов Microsoft (COM)).
-
Начнем рассмотрение с реализации сервера, находящейся в файле ChatServer.h. В архитектуре событий .NET используются делегаты с особой сигнатурой: | _delegate void JoinHandler( | Object *pSender, ChatEventArg *pe); | _delegate void QuitHandler( | Object *pSender, ChatEventArg *pe);
-
В этой части программы реализованы функции-обработчики событий. | _gc class ChatClient | // класс сборщика мусора ChatClient | { | public: | static void OnJoinChat(Object *pSender, ChatEventArg *pe) | { | Console::WriteLine( | "sender = {0}, {1} has joined the chat", | // "отправитель = {0}, {1} присоединился к чату ", | pSender, | pe › pName);
-
Пример чат-программы EventOeTO иллюстрирует архитектуру как сервера, так и клиента. В сервере реализованы следующие методы: | JomChat, | QuitChat; | ShowMembers | Когда в программе регистрируется новый участник или уходит зарегистрированный, сервер посылает сообщение об этом клиенту.
-
В этой главе рассмотрены некоторые важные связи управляемого C++ и .NET Framework, причем начали мы с базового класса Object (Объект). Мы рассмотрели использование коллекций, в частности, те методы класса Object (Объект), которые следует переопределять для работы с коллекциями.