Иллюстрированный самоучитель по Architecture .NET

Управляемый C++ в .NET Framework

  • Объект системы System::Object

    Язык C++ – мощный инструмент разработки программ, оказавший огромное влияние на развитие вычислительной науки. Управляемые (managed) расширения от Microsoft добавили в язык C++ целый новый мир – мир .NET.
  • Общедоступные методы экземпляров класса Object (Объект)

    Есть четыре общедоступных метода экземпляров класса Object (Объект), три из которых являются виртуальными и часто подменяются в управляемых классах. | Метод Equals (Равняется) | public: virtual bool Equals(Object*); | // виртуальный логический (булев) Равняется (Объект *);
  • Защищенные методы экземпляров класса object (Объект). Родовые интерфейсы и обычное поведение.

    Защищенными являются два метода класса Object (Объект). Эти методы могут использоваться только производными классами. | Метод MemberwiseClone | protected: Object* MemberwiseClone(); // защищенный | Данный метод создает поверхностную (shallow) копию объекта.
  • Использование методов класса object (Объект) в классе Customer (Клиент)

    Для иллюстрации описанных методов рассмотрим класс Customer (Клиент) до и после перегрузки методов Equals (Равняется), ToString и GetHashCode. | Стандартные методы класса object (Объект) | Если не произвести подмены виртуальных методов объекта Object (Объект), наш класс будет наследовать стандартное поведение. Это поведение продемонстрировано в CustomsrObjectXStepl.
  • Коллекции. Пример класса ArrayList (Список массивов).

    Библиотека классов NET Framework предлагает широкий выбор классов для работы с коллекциями объектов. Все эти классы находятся в пространстве имен System::Collections (Система::Коллекции) и реализуют ряд различного типа коллекций, в том числе списки, очереди, массивы, стеки и хэш-таблицы В коллекциях содержатся экземпляры класса Object (Объект).
  • Интерфейсы

    Концепция интерфейсов – одна из основных в современном программировании. Большие системы неизбежно разделяются на части, и существенным становится вопрос о взаимодействии этих частей друг с другом. Правила такого взаимодействия должны быть строго определены и постоянны, так как их изменение может повлиять на несколько частей системы.
  • Основные сведения об интерфейсах

    Объектно-ориентированное программирование – мощная методология, помогающая в проектировании и реализации больших программных систем. Использование классов позволяет применять обобщение (абстракцию) и инкапсуляцию.
  • Программирование с использованием интерфейсов

    Использование интерфейсов облегчает программирование на управляемом C++. Интерфейсы реализуются через классы, и для получения указателя на интерфейс можно выполнить приведение указателя на класс. Методы интерфейсов можно вызывать, используя и указатели на класс, и указатели на интерфейс;
  • Динамическое использование интерфейсов

    Полезной особенностью интерфейсов является возможность их использования в динамических сценариях, что позволяет по ходу выполнения программы проверять, поддерживается ли интерфейс определенным классом. Если интерфейс поддерживается, мы можем воспользоваться предоставляемыми им возможностями;
  • Программа Бюро путешествий Acme (Acme Travel Agency)

    Попытаемся применить полученные знания об интерфейсах для небольшой переделки программы Бюро путешествий Acme (Acme Travel Agency). Одним из наибольших достоинств интерфейсов является то, что благодаря им повышается уровень абстракции, – это позволяет понять и ощутить систему на уровне взаимодействия ее отдельных частей, абстрагируясь от конкретной их реализации.
  • Явное определение интерфейсов. Родовые интерфейсы в .NET.

    При использовании интерфейсов может возникать неопределенность в случае, если в двух реализованных классом интерфейсах есть методы с одинаковыми именами и сигнатурами. Просмотрим, например, следующие версии интерфейсов lAccount и IStatement.
  • Интерфейсы коллекций

    Теперь, достаточно подробно обсудив концепцию интерфейсов, мы можем обратить более пристальный взгляд на коллекции, в частности, на класс ArrayList (Список массивов), который мы активно использовали в программе Бюро путешествий Acme (Acme Travel Agency).
  • Копирование объектов и интерфейс icioneable

    Иногда бывает необходимо сделать копию объекта. Если при этом копируются объекты, которые содержат другие объекты или указатели на них, то для корректной реализации этого процесса необходимо понимать его особенности.
  • Сравнение объектов

    Итак, мы подробно рассмотрели копирование объектов. Теперь рассмотрим сравнение объектов. Для сравнения объектов в .NET Framework используется интерфейс IComparable. В этом разделе мы в качестве примера воспользуемся интерфейсом IComparablе для сортировки массива.
  • Что такое каркасы приложений. Делегаты.

    Наши примеры предполагают использование некоего каркаса приложений. Такой каркас – это больше, чем просто библиотека. При использовании библиотеки вы можете вызывать в своих программах библиотечные функции.
  • Объявление делегата. Определение метода. Создание экземпляра делегата.

    В управляемом C++ делегат объявляется с помощью особого обозначения – ключевого слова _delegate (делегат) – и сигнатуры инкапсулированного метода. В соответствии с соглашением об именовании, имя делегата должно заканчиваться буквосочетанием "Callback".
  • Вызов делегата. Объединение экземпляров делегатов.

    Синтаксис "вызова" делегата совпадает с синтаксисом вызова метода. Делегат не является сам по себе методом, но он инкапсулирует метод. Делегат "передает" вызов инкапсулированному методу, потому и называется делегатом (от англ, delegate – поручать, уполномочивать).
  • Полный пример

    Программа DelegateAccount иллюстрирует использование делегатов на примере банковского счета. В файле DelegateAccount.cpp объявляется делегат NotifyCallback. Методы, соответствующие по сигнатурам методам, описанным в объявлении делегата, реализованы в классе DelegateAccount.
  • Моделирование фондовой биржи

    Для дальнейшего знакомства с использованием делегатов рассмотрим пример моделирования фондовой биржи, реализованный в папке stockMarket. Модель состоит из двух модулей: | Модуль Admin (Управляющий модуль) предоставляет пользовательский интерфейс для конфигурирования и запуска модели.
  • События. События в управляемом C++ и .NET.

    Делегаты – основа более сложного протокола обратного вызова, называемого событиями. Согласно замыслу, сервер реализует входящие интерфейсы, которые могут быть вызваны клиентом. На диаграммах подобный интерфейс можно обозначить с помощью маленького кружка (обозначение, использующееся в модели компонентных объектов 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 (Объект), которые следует переопределять для работы с коллекциями.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.