Что означает объектно-ориентированное окно
Обновлено: 21.11.2024
Когда вы создаете объект управления (HWND ) в Windows API, вам не разрешен прямой доступ к членам объекта управления, вы можете получить к нему доступ только через определенные функции, что является характеристикой ООП.
Кроме того, Windows API поддерживает полиморфизм, например, у меня может быть следующая функция:
Приведенная выше функция может изменить текст многих типов объектов, а не только одного типа, например, она может изменить заголовок окна, текст элемента управления редактирования и заголовок элемента управления кнопки.
Я не знаю, поддерживает ли Windows API наследование, но даже если нет, я думаю, что основная цель наследования в ООП — разрешить полиморфизм, который Windows API поддерживает, как я показал.
Означает ли это, что Windows API можно считать объектно-ориентированной структурой?
Windows API не является платформой. Это API. Помимо этого, вы увидите множество парадигм ООП, реализованных в C. Также есть наследование (например, регистрация класса окна, который делегирует сообщения DefWindowProc, реализация базового класса). Тем не менее, этот вопрос не очень подходит для Stack Overflow.
@IInspectable Несмотря на то, что в традиционной объектно-ориентированной среде вы не регистрируете указатель функции для каждого экземпляра для реализации функции-члена; вы должны объявить подкласс вашего гипотетического класса UrWindow, который переопределяет функцию обратного вызова виртуального члена.
В API Windows также много COM. COM сразу же поддерживает инкапсуляцию, специализацию и полиморфизм. @Davislor: Вы не можете сделать это в C. В C регистрация указателей на функции является распространенным способом реализации пользовательского поведения.
@IInspectable В середине 90-х, когда я писал на Модуле-2, я бы назвал это «объектно-ориентированным, но не объектно-ориентированным».
1 Ответ 1
Дескрипторы файлов и окон в Windows аналогичны потокам, файловым дескрипторам в Unix, указателям FILE в стандартной библиотеке C и т. д. Есть сходство между передачей непрозрачного дескриптора библиотечным функциям и вызовом функций-членов с неявным указателем this.
Еще один пример, который становится ближе, — это классы окон, которые вы регистрируете с помощью RegisterClassEx() . Это переходный этап между API-интерфейсом в стиле дескриптора и фреймворком вроде COM, который, по общему мнению, является «объектно-ориентированным»: вы регистрируете структуру, содержащую указатель на функцию, которая очень похожа на указатели на функции-члены в таблице виртуальных функций. Чего у вас нет, так это какой-либо иерархии классов или выбора интерфейсов для реализации. Вы не переопределяете реализацию по умолчанию и не наследуете одни методы, переопределяя другие. Вы просто передаете структуру, содержащую указатели на функции.
Различие может стать нечетким. Если вы посмотрите на семейство языков, разработанное Николасом Виртом, Pascal — это традиционный структурированный императивный язык, вдохновленный Algol, а Modula, Modula-2 и Oberon развиваются экспериментально в объектно-ориентированном направлении. В то время эти промежуточные языки назывались «объектно-ориентированными». К середине 90-х такие языки, как Delphi и Object Pascal, соответствовали объектно-ориентированной парадигме.
Однако библиотеки, подобные библиотекам конца 70-х годов, обычно не называются "объектно-ориентированными". В частности, у них нет иерархии классов с наследованием. Клиентское приложение также не управляет экземплярами самостоятельно, а их создание и уничтожение автоматизировано для предотвращения утечек памяти.
Когда C API делает вещи, похожие на полиморфизм и наследование, такие как предоставление указателя на функцию обратного вызова, он делает это по-другому. В обычном объектно-ориентированном языке вы бы статически определили производный класс окна, который переопределяет виртуальную функцию-член, а не предоставлял бы произвольный указатель функции для обратного вызова (хотя есть некоторое сходство с шаблоном объектно-ориентированного посетителя).< /p>
Такие вещи, как «оконные классы» с похожими названиями, — это просто обратные вызовы. Несмотря на то, что все реализации полиморфных объектов построены на основе структур, содержащих указатели на функции, не все программы, использующие функции обратного вызова, являются объектно-ориентированными. Примером, более близким к объектно-ориентированному программированию, является то, как Winsock 2 делает дескрипторы сокетов особым типом файловых дескрипторов, которые могут быть переданы файловым функциям ядра (с приведением типов). Если бы у нас был объектно-ориентированный API, который переименовывал функции-члены в глобальные функции, делал неявный указатель this явным аргументом, а затем приводил его к непрозрачному дескриптору, он по-прежнему был бы в основном объектно-ориентированным. Единственное, что он потеряет, это безопасность статического типа и инкапсуляция. Еще более похожей на ООП, до такой степени, что я бы определенно назвал ее ООП, является компонентная объектная модель и ее преемники, в которых объекты реализуют интерфейсы.
Существовало несколько «объектно-ориентированных» API для Windows, в том числе Microsoft Foundation Classes, объектная библиотека Borland для Windows, связывание и встраивание объектов, более новая объектная модель компонентов и библиотеки Common Language Runtime, а также еще более новая среда выполнения Windows.
Visual Basic обеспечивает полную поддержку объектно-ориентированного программирования, включая инкапсуляцию, наследование и полиморфизм.
Инкапсуляция означает, что группа связанных свойств, методов и других членов рассматривается как единый блок или объект.
Наследование описывает возможность создания новых классов на основе существующего класса.
Полиморфизм означает, что у вас может быть несколько взаимозаменяемых классов, даже если каждый класс реализует одни и те же свойства или методы по-разному.
В этом разделе описываются следующие понятия:
Классы и объекты
Термины класс и объект иногда используются взаимозаменяемо, но на самом деле классы описывают тип объектов, а объекты используются < em>экземпляры классов. Таким образом, процесс создания объекта называется создание экземпляра. Используя аналогию с чертежом, класс — это чертеж, а объект — это здание, созданное по этому чертежу.
Чтобы определить класс:
Visual Basic также предоставляет облегченную версию классов, называемых структурами, которые полезны, когда вам нужно создать большой массив объектов и вы не хотите использовать для этого слишком много памяти.
Для получения дополнительной информации см.:
Участники класса
Каждый класс может иметь разные члены класса, которые включают свойства, описывающие данные класса, методы, определяющие поведение класса, и события, обеспечивающие связь между различными классами и объектами.
Свойства и поля
Поля и свойства представляют информацию, содержащуюся в объекте. Поля похожи на переменные, потому что их можно читать или задавать напрямую.
Чтобы определить поле:
У свойств есть процедуры получения и установки, которые обеспечивают больший контроль над тем, как значения устанавливаются или возвращаются.
Visual Basic позволяет либо создать личное поле для хранения значения свойства, либо использовать так называемые автоматически реализуемые свойства, которые автоматически создают это поле за кулисами и обеспечивают базовую логику для процедур свойств.
Чтобы определить автоматически реализуемое свойство:
Если вам нужно выполнить некоторые дополнительные операции для чтения и записи значения свойства, определите поле для хранения значения свойства и предоставьте базовую логику для его сохранения и извлечения:
Большинство свойств имеют методы или процедуры для установки и получения значения свойства. Однако вы можете создать свойства только для чтения или только для записи, чтобы запретить их изменение или чтение. В Visual Basic вы можете использовать ключевые слова ReadOnly и WriteOnly. Однако автоматически реализуемые свойства не могут быть доступны только для чтения или только для записи.
Для получения дополнительной информации см.:
Методы
метод – это действие, которое может выполнять объект.
В Visual Basic существует два способа создания метода: оператор Sub используется, если метод не возвращает значение; Оператор Function используется, если метод возвращает значение.
Чтобы определить метод класса:
У класса может быть несколько реализаций или перегрузок одного и того же метода, отличающихся количеством параметров или типов параметров.
Чтобы перегрузить метод:
В большинстве случаев вы объявляете метод в определении класса. Однако Visual Basic также поддерживает методы расширения, которые позволяют добавлять методы к существующему классу вне фактического определения класса.
Для получения дополнительной информации см.:
Конструкторы
Конструкторы — это методы класса, которые выполняются автоматически при создании объекта заданного типа. Конструкторы обычно инициализируют элементы данных нового объекта. Конструктор может запускаться только один раз при создании класса. Более того, код в конструкторе всегда выполняется перед любым другим кодом в классе. Однако вы можете создать несколько перегрузок конструктора так же, как и для любого другого метода.
Чтобы определить конструктор для класса:
Деструкторы
События
События позволяют классу или объекту уведомлять другие классы или объекты, когда происходит что-то интересное. Класс, который отправляет (или инициирует) событие, называется издателем, а классы, которые получают (или обрабатывают) событие, называются подписчиками. Дополнительную информацию о событиях, о том, как они вызываются и обрабатываются, см. в разделе События.
Чтобы объявить события, используйте оператор Event.
Чтобы указать обработчики событий декларативным способом, используйте оператор WithEvents и предложение Handles.
Чтобы иметь возможность динамически добавлять, удалять и изменять обработчик события, связанный с событием, используйте оператор AddHandler и оператор RemoveHandler вместе с оператором AddressOf.
Вложенные классы
Класс, определенный внутри другого класса, называется вложенным. По умолчанию вложенный класс является закрытым.
Чтобы создать экземпляр вложенного класса, используйте имя класса-контейнера, за которым следует точка, а затем имя вложенного класса:
Модификаторы доступа и уровни доступа
Все классы и члены классов могут указать, какой уровень доступа они предоставляют другим классам, используя модификаторы доступа.
Доступны следующие модификаторы доступа:
Модификатор Visual Basic | Определение |
---|---|
Общедоступный | < td>Тип или член может быть доступен любому другому коду в той же сборке или другой сборке, которая на него ссылается.|
Private | Тип или член Доступ к типу или члену возможен только с помощью кода в том же классе или в производный класс. |
Друг | К типу или члену можно получить доступ из любого кода в той же сборке, но не из другой сборки. |
Защищенный друг | К типу или члену может обращаться любой код в той же сборке или любой производный класс в другой сборке. |
Создание экземпляров классов
Чтобы создать объект, необходимо создать экземпляр класса или создать экземпляр класса.
После создания экземпляра класса вы можете присваивать значения свойствам и полям экземпляра и вызывать методы класса.
Чтобы присвоить значения свойствам в процессе создания экземпляра класса, используйте инициализаторы объектов:
Для получения дополнительной информации см.:
Общие классы и участники
Общий член класса — это свойство, процедура или поле, совместно используемое всеми экземплярами класса.
Чтобы определить общего члена:
Чтобы получить доступ к общему члену, используйте имя класса, не создавая объект этого класса:
Общие модули в Visual Basic имеют только общие элементы и не могут быть созданы. Общие члены также не могут получить доступ к не общим свойствам, полям или методам
Для получения дополнительной информации см.:
Анонимные типы
Анонимные типы позволяют создавать объекты без написания определения класса для типа данных. Вместо этого компилятор создает для вас класс. У класса нет имени для использования, и он содержит свойства, указанные вами при объявлении объекта.
Чтобы создать экземпляр анонимного типа:
Дополнительную информацию см. в разделе Анонимные типы.
Наследование
Visual Basic не поддерживает множественное наследование. То есть вы можете указать только один базовый класс для производного класса.
Чтобы наследовать от базового класса:
По умолчанию все классы могут наследоваться. Однако вы можете указать, следует ли классу не использоваться в качестве базового класса, или создать класс, который можно использовать только в качестве базового класса.
Чтобы указать, что класс нельзя использовать в качестве базового класса:
Чтобы указать, что класс может использоваться только как базовый класс и не может быть создан:
Для получения дополнительной информации см.:
Переопределение участников
По умолчанию производный класс наследует все члены своего базового класса. Если вы хотите изменить поведение унаследованного элемента, вам необходимо переопределить его. То есть вы можете определить новую реализацию метода, свойства или события в производном классе.
Следующие модификаторы используются для управления переопределением свойств и методов:
Модификатор Visual Basic | Определение |
---|---|
Переопределяемый | < td>Позволяет переопределить член класса в производном классе.|
Переопределяет | Переопределяет виртуальный (переопределяемый) член, определенный в базовом классе.< /td> |
NotOverridable | Предотвращает переопределение члена в наследующем классе. |
MustOverride | Требует, чтобы член класса был переопределен в производном классе. |
Тени | Скрывает член, унаследованный от базового класса |
Интерфейсы
Интерфейсы, как и классы, определяют набор свойств, методов и событий. Но в отличие от классов, интерфейсы не обеспечивают реализации. Они реализуются классами и определяются как отдельные сущности от классов. Интерфейс представляет собой контракт в том смысле, что класс, реализующий интерфейс, должен реализовать каждый аспект этого интерфейса точно так, как он определен.
Чтобы определить интерфейс:
Чтобы реализовать интерфейс в классе:
Для получения дополнительной информации см.:
Общие
Чтобы определить универсальный класс:
Чтобы создать экземпляр универсального класса:
Для получения дополнительной информации см.:
Делегаты
делегат — это тип, который определяет сигнатуру метода и может предоставить ссылку на любой метод с совместимой сигнатурой. Вы можете вызвать (или вызвать) метод через делегат. Делегаты используются для передачи методов в качестве аргументов другим методам.
Обработчики событий — это не что иное, как методы, вызываемые через делегаты. Дополнительные сведения об использовании делегатов в обработке событий см. в разделе События.
Чтобы создать делегата:
Чтобы создать ссылку на метод, соответствующий сигнатуре, указанной делегатом:
Структура языка программирования, в которой данные и связанная с ними обработка ("методы") определяются как автономные сущности, называемые "объектами". Сегодняшние языки объектно-ориентированного программирования (ООП), такие как C++ и Java, являются нормой и предоставляют формальный набор правил для создания объектов и управления ими. Данные хранятся в традиционной реляционной базе данных или в объектной базе данных, если данные имеют сложную структуру. См. сопоставление O-R и базу данных объектов.
Есть три основных особенности объектно-ориентированного программирования, отличающие его от языков, не связанных с ООП: инкапсуляция, наследование и полиморфизм.
Инкапсуляция обеспечивает модульность
Под инкапсуляцией понимается создание автономных модулей, которые связывают функции обработки с данными. Эти определяемые пользователем типы данных называются «классами», а один экземпляр класса является «объектом». Например, в системе начисления заработной платы класс может быть менеджером, а Пэт и Ян могут быть двумя экземплярами (два объекта) класса менеджера. Инкапсуляция обеспечивает хорошую модульность кода, благодаря чему подпрограммы остаются отдельными и менее подверженными конфликту друг с другом.
Наследование передает «знание» вниз
Классы создаются в иерархиях, а наследование позволяет передавать структуру и методы одного класса вниз по иерархии. Это означает, что при добавлении функций в сложные системы требуется меньше программирования. Если шаг добавляется в нижнюю часть иерархии, необходимо добавить только обработку и данные, связанные с этим уникальным шагом. Все остальное передается по наследству. Возможность повторного использования существующих объектов считается основным преимуществом объектной технологии.
Полиморфизм принимает любую форму
Объектно-ориентированное программирование позволяет создавать процедуры для объектов, точный тип которых неизвестен до времени выполнения. Например, экранный курсор может изменить свою форму со стрелки на линию в зависимости от режима программы. Подпрограмма для перемещения курсора на экране в ответ на движение мыши будет написана для «курсора», а полиморфизм позволяет этому курсору принимать любую форму, необходимую во время выполнения. Это также позволяет легко интегрировать новые формы.
Языки ООП
Использовавшийся для моделирования поведения системы в конце 1960-х годов, SIMULA был первым объектно-ориентированным языком. В 1970-х Xerox's Smalltalk был первым объектно-ориентированным языком программирования, который использовался для создания графического пользовательского интерфейса (см. Xerox Star). ACTOR и Eiffel также были ранними языками ООП.
Вместо отдельных таблиц сотрудников, отделов и должностей класс сотрудников содержит данные и обработку для всех сотрудников. Каждый подкласс (менеджер, секретарь и т. д.) имеет свои собственные данные и обработку, но также наследует все от класса сотрудников. Изменения, внесенные в класс сотрудников, влияют на все подклассы.
Объектно-ориентированное программирование в Windows представляет методы объектно-ориентированного программирования (ООП), которые можно использовать в программировании для Windows. Книга состоит из 15 глав, которые т. прочитать полное описание
Поделиться этой книгой
Просмотреть содержимое
Оглавление
Действия для выбранных глав
Основная часть
Авторское право
Предисловие
1 — Введение в объектно-ориентированное программирование
2 — Языки программирования
3 — Окружающая среда Windows
4 – Создание приложения
5 — Окна и диалоговые окна
6 — Элементы управления
7 – Стандартные элементы управления
8 – Меню
9 – Реагирование на события
10 - Графические операции
11 – Буфер обмена
12 — Растровые изображения, значки и курсоры
13 – Доступ к файлам на диске
14 – Справочная система
15 – Передача данных
Индекс
О книге
Описание
Объектно-ориентированное программирование в Windows представляет методы объектно-ориентированного программирования (ООП), которые можно использовать в программировании для Windows. Книга состоит из 15 глав, посвященных области ООП. Глава 1 содержит вводный рассказ об ООП, а глава 2 посвящена языкам программирования. В главе 3 рассматривается среда Windows, а в главе 4 обсуждается создание приложения. Заняты окна и диалоговые окна, а также элементы управления и стандартные элементы управления. Затем книга охватывает меню и реакцию на события.Также рассматриваются графические операции, буфер обмена, растровые изображения, значки и курсоры. В книге также рассматривается доступ к файлам на диске, а затем обсуждается файловая система справки. Последняя глава посвящена передаче данных. Текст будет очень полезен тем, кто хочет писать программы для Windows.
Объектно-ориентированное программирование в Windows представляет методы объектно-ориентированного программирования (ООП), которые можно использовать в программировании для Windows. Книга состоит из 15 глав, посвященных области ООП. Глава 1 содержит вводный рассказ об ООП, а глава 2 посвящена языкам программирования. В главе 3 рассматривается среда Windows, а в главе 4 обсуждается создание приложения. Заняты окна и диалоговые окна, а также элементы управления и стандартные элементы управления. Затем книга охватывает меню и реакцию на события. Также рассматриваются графические операции, буфер обмена, растровые изображения, значки и курсоры. В книге также рассматривается доступ к файлам на диске, а затем обсуждается файловая система справки. Последняя глава посвящена передаче данных. Текст будет очень полезен тем, кто хочет писать программы для Windows.
Читайте также: