Класс (компьютерное программирование)
В объектно-ориентированном программировании класс , определяет общие аспекты объектов созданных из класса. Возможности класса различаются в разных языках программирования , но обычно общие аспекты состоят из состояния ( переменных ) и поведения ( методов ), каждый из которых связан либо с конкретным объектом, либо со всеми объектами этого класса. [ 1 ] [ 2 ]
Состояние объекта может различаться в каждом экземпляре класса, тогда как состояние класса является общим для всех них. Методы объекта включают доступ к состоянию объекта (через неявный или явный параметр, ссылающийся на объект), тогда как методы класса этого не делают.
Если язык поддерживает наследование , класс может быть определен на основе другого класса со всем его состоянием и поведением, а также дополнительным состоянием и поведением, которые дополнительно специализируют класс. Специализированный класс является подклассом , а класс, на котором он основан, — его суперклассом .
Атрибуты
[ редактировать ]Жизненный цикл объекта
[ редактировать ]Будучи экземпляром класса, объект создается из класса посредством создания экземпляра . Память выделяется и инициализируется для состояния объекта, а ссылка для потребляющего кода предоставляется на объект. Объект можно использовать до тех пор, пока он не будет уничтожен – его память состояния не будет освобождена.
Большинство языков допускают пользовательскую логику событий жизненного цикла с помощью конструктора и деструктора .
Тип
[ редактировать ]Объект выражает тип данных как интерфейс — тип каждой переменной-члена и сигнатуру каждой функции-члена (метода). Класс определяет реализацию интерфейса, а создание экземпляра класса приводит к созданию объекта, который предоставляет реализацию через интерфейс. [ 3 ] С точки зрения теории типов, класс — это реализация — « конкретная структура данных и набор подпрограмм», — а тип — это интерфейс . Разные (конкретные) классы могут создавать объекты одного и того же (абстрактного) типа (в зависимости от системы типов). Например, тип (интерфейс) Стек может быть реализован с помощью SmallStack , который быстр для небольших стеков, но плохо масштабируется и ScalableStack , который хорошо масштабируется, но требует больших затрат для небольших стеков.
Структура
[ редактировать ]Класс содержит данных полей описания (или свойств , полей , данных членов или атрибутов ). Обычно это типы и имена полей, которые будут связаны с переменными состояния во время выполнения программы; эти переменные состояния принадлежат либо классу, либо конкретным экземплярам класса. В большинстве языков структура, определенная классом, определяет расположение памяти, используемой его экземплярами. Возможны и другие реализации: например, объекты в Python используют ассоциативные контейнеры «ключ-значение». [ 4 ]
Некоторые языки программирования, такие как Eiffel, поддерживают спецификацию инвариантов как часть определения класса и реализуют их через систему типов. Инкапсуляция состояния необходима для обеспечения соблюдения инвариантов класса.
Поведение
[ редактировать ]Поведение класса или его экземпляров определяется с помощью методов . Методы — это подпрограммы , способные работать с объектами или классами. Эти операции могут изменить состояние объекта или просто предоставить способы доступа к нему. [ 5 ] Существует множество видов методов, но их поддержка различается в зависимости от языка. Некоторые типы методов создаются и вызываются программным кодом, тогда как другие специальные методы, такие как конструкторы, деструкторы и операторы преобразования, создаются и вызываются кодом, сгенерированным компилятором. Язык также может позволять программисту определять и вызывать эти специальные методы. [ 6 ] [ 7 ]
Интерфейс класса
[ редактировать ]Каждый класс реализует (или реализует ) интерфейс, обеспечивая структуру и поведение. Структура состоит из данных и состояния, а поведение состоит из кода, определяющего реализацию методов. [ 8 ] Существует различие между определением интерфейса и реализацией этого интерфейса; однако во многих языках программирования эта грань размыта, поскольку объявления классов одновременно определяют и реализуют интерфейс. Однако некоторые языки предоставляют функции, разделяющие интерфейс и реализацию. Например, абстрактный класс может определять интерфейс без предоставления реализации.
Языки, поддерживающие наследование классов, также позволяют классам наследовать интерфейсы от классов, от которых они произошли.
Например, если «класс A» наследуется от «класса B» и если «класс B» реализует интерфейс «интерфейс B», то «класс A» также наследует функциональность (объявление констант и методов), предоставляемую «интерфейсом B».
В языках, поддерживающих спецификаторы доступа , интерфейс класса считается набором открытых членов класса, включая как методы, так и атрибуты (посредством неявных методов получения и установки ); любые частные члены или внутренние структуры данных не предназначены для зависимости от внешнего кода и, следовательно, не являются частью интерфейса.
Методология объектно-ориентированного программирования требует, чтобы операции любого интерфейса класса были независимы друг от друга. В результате получается многоуровневая конструкция, в которой клиенты интерфейса используют методы, объявленные в интерфейсе. Интерфейс не предъявляет клиентам требований к вызову операций одного интерфейса в каком-либо определенном порядке. Преимущество этого подхода заключается в том, что клиентский код может предполагать, что операции интерфейса доступны для использования всякий раз, когда клиент имеет доступ к объекту. [ 9 ] [ нужна ссылка ]
- Пример интерфейса класса
Кнопки на передней панели телевизора — это интерфейс между вами и электропроводкой на другой стороне пластикового корпуса. Вы нажимаете кнопку «питание», чтобы включать и выключать телевизор. В этом примере экземпляром является ваш конкретный телевизор, каждый метод представлен кнопкой, а все кнопки вместе составляют интерфейс (другие телевизоры той же модели, что и ваш, будут иметь тот же интерфейс). В своей наиболее распространенной форме интерфейс представляет собой спецификацию группы связанных методов без какой-либо связанной реализации этих методов.
Телевизор также имеет множество атрибутов , таких как размер и поддержка цвета, которые вместе составляют его структуру. Класс представляет собой полное описание телевизора, включая его атрибуты (структуру) и кнопки (интерфейс).
Получение общего количества выпущенных телевизоров может быть статическим методом класса телевизоров. Этот метод связан с классом, но находится за пределами домена каждого экземпляра класса. Другим примером является статический метод, который находит конкретный экземпляр из множества всех телевизионных объектов.
Доступность для участников
[ редактировать ]Ниже приведен общий набор спецификаторов доступа : [ 10 ]
- Private (или class-private ) ограничивает доступ к самому классу. Доступ к закрытым членам могут иметь только методы, являющиеся частью одного и того же класса.
- Protected (или class-protected ) позволяет самому классу и всем его подклассам получать доступ к члену.
- Открытость означает, что любой код может получить доступ к элементу по его имени.
Хотя многие объектно-ориентированные языки поддерживают указанные выше спецификаторы доступа, их семантика может отличаться.
Объектно-ориентированное проектирование использует спецификаторы доступа в сочетании с тщательным проектированием реализаций общедоступных методов для обеспечения соблюдения инвариантов классов — ограничений на состояние объектов. Спецификаторы доступа обычно используются для отделения внутренних данных класса от его интерфейса: внутренняя структура становится частной, а общедоступные методы доступа могут использоваться для проверки или изменения таких частных данных.
Спецификаторы доступа не обязательно контролируют видимость , поскольку даже частные члены могут быть видны внешнему коду клиента. В некоторых языках на недоступный, но видимый элемент можно ссылаться во время выполнения (например, с помощью указателя, возвращаемого функцией-членом), но попытка использовать его путем ссылки на имя элемента из клиентского кода будет предотвращена. с помощью средства проверки типов. [ 11 ]
языка Различные объектно-ориентированные языки программирования обеспечивают доступность и видимость членов в разной степени и, в зависимости от системы типов и политики компиляции, реализуются либо во время компиляции , либо во время выполнения . Например, язык Java не позволяет компилировать клиентский код, который обращается к частным данным класса. [ 12 ] В языке C++ частные методы видимы, но недоступны в интерфейсе; однако их можно сделать невидимыми, явно объявив полностью абстрактные классы, которые представляют интерфейсы класса. [ 13 ]
В некоторых языках предусмотрены другие схемы доступности:
- Доступность экземпляра и класса : Ruby поддерживает спецификаторы доступа , частные и защищенные экземпляром , вместо частных и защищенных классом соответственно. Они отличаются тем, что ограничивают доступ на основе самого экземпляра, а не класса экземпляра. [ 14 ]
- Friend : C++ поддерживает механизм, при котором функция, явно объявленная как дружественная функция класса, может обращаться к членам, обозначенным как частные или защищенные. [ 15 ]
- На основе пути : Java поддерживает ограничение доступа к элементу внутри пакета Java , который является логическим путем к файлу. Однако при расширении платформы Java распространенной практикой является реализация классов в том же пакете, что и класс платформы, для доступа к защищенным членам. Исходный файл может существовать в совершенно другом месте и может быть развернут в другом файле .jar, но при этом находиться в том же логическом пути, что касается JVM. [ 10 ]
Наследование
[ редактировать ]Концептуально суперкласс — это надмножество своих подклассов. Например, GraphicObject может быть суперклассом Прямоугольник и Эллипс , в то время как Square будет подклассом Прямоугольник . Все это отношения подмножеств и в теории множеств, т. е. все квадраты являются прямоугольниками, но не все прямоугольники являются квадратами.
Распространенной концептуальной ошибкой является ошибочное принятие части отношения за подкласс. Например, легковой и грузовой автомобили являются видами транспортных средств, и было бы целесообразно смоделировать их как подклассы класса транспортных средств. Однако было бы ошибкой моделировать части автомобиля как отношения подклассов. Например, автомобиль состоит из двигателя и кузова, но было бы нецелесообразно моделировать двигатель или кузов как подкласс автомобиля.
В объектно-ориентированном моделировании такие отношения обычно моделируются как свойства объекта. В этом примере Класс автомобиля будет иметь свойство под названием части . части будут типизированы для хранения коллекции объектов, таких как экземпляры Тело , Двигатель , Шины и т. д. Языки объектного моделирования, такие как UML, включают возможности моделирования различных аспектов «части» и других видов отношений — таких данных, как мощность объектов, ограничения на входные и выходные значения и т. д. Эта информация может использоваться инструментами разработчика для генерировать дополнительный код помимо основных определений данных для объектов, например проверку ошибок в методах get и set . [ 16 ]
Один из важных вопросов при моделировании и реализации системы объектных классов заключается в том, может ли класс иметь один или несколько суперклассов. В реальном мире с реальными множествами редко можно встретить множества, которые не пересекаются более чем с одним другим множеством. Однако, хотя некоторые системы, такие как Flavors и CLOS, предоставляют возможность более чем одному родителю делать это во время выполнения, это вносит сложность, которую многие в объектно-ориентированном сообществе считают противоположной целям использования объектных классов в первую очередь. Понимание того, какой класс будет отвечать за обработку сообщения, может оказаться сложным при работе с несколькими суперклассами. При небрежном использовании эта функция может привести к возникновению некоторых из тех же классов сложности и неоднозначности системы, которых следует избегать. [ 17 ]
Большинство современных объектно-ориентированных языков, таких как Smalltalk и Java, требуют одинарного наследования во время выполнения. Для этих языков множественное наследование может быть полезно для моделирования, но не для реализации.
Однако объекты семантического веб- приложения имеют несколько суперклассов. Нестабильность Интернета требует такого уровня гибкости, и технологические стандарты, такие как язык веб-онтологии (OWL), предназначены для его поддержки.
Аналогичная проблема заключается в том, можно ли изменить иерархию классов во время выполнения. Такие языки, как Flavors, CLOS и Smalltalk, поддерживают эту функцию как часть своих метаобъектных протоколов . Поскольку классы сами по себе являются первоклассными объектами, их структуру можно динамически изменять, отправляя им соответствующие сообщения. Другие языки, в которых больше внимания уделяется строгой типизации, например Java и C++, не позволяют изменять иерархию классов во время выполнения. Семантические веб-объекты имеют возможность вносить изменения в классы во время выполнения. Обоснование аналогично обоснованию разрешения нескольких суперклассов: Интернет настолько динамичен и гибок, что для управления этой нестабильностью требуются динамические изменения в иерархии. [ 18 ]
Хотя многие языки, основанные на классах, поддерживают наследование, наследование не является неотъемлемым аспектом классов. Объектно -ориентированный язык (т.е. классический Visual Basic ) поддерживает классы, но не поддерживает наследование.
Межклассовые отношения
[ редактировать ]Язык программирования может поддерживать различные функции отношений классов.
Композиционный
[ редактировать ]Классы могут состоять из других классов, тем самым устанавливая композиционные отношения между включающим их классом и его встроенными классами. Композиционные отношения между классами также широко известны как отношения «имеет» . [ 19 ] Например, класс «Автомобиль» может состоять из класса «Двигатель» и содержать его. Следовательно, у автомобиля есть двигатель. Одним из аспектов композиции является включение, то есть включение экземпляров компонента в экземпляр, в котором они есть. Если включающий объект содержит экземпляры компонентов по значению, компоненты и их включающий объект имеют одинаковое время жизни . Если компоненты содержатся по ссылке, они могут иметь разный срок службы. [ 20 ] Например, в Objective-C 2.0:
@interface Car : NSObject
@property NSString *name;
@property Engine *engine
@property NSArray *tires;
@end
Этот автомобиля Класс имеет экземпляр NSString ( строковый объект), Двигатель и NSArray (объект массива).
Иерархический
[ редактировать ]Классы могут быть производными от одного или нескольких существующих классов, тем самым устанавливая иерархические отношения между производными классами ( базовыми классами , родительскими классами или суперклассы ) и производный класс ( дочерний класс или подкласс ). Отношения производного класса с производными классами широко известны как отношения is-a . [ 21 ] Например, класс «Кнопка» может быть производным от класса «Control». Следовательно, кнопка — это элемент управления. Структурные и поведенческие члены родительских классов наследуются дочерним классом. Производные классы могут определять дополнительные структурные элементы (поля данных) и поведенческие элементы (методы) в дополнение к тем, которые они наследуют , и, следовательно, являются специализациями своих суперклассов. Кроме того, производные классы могут переопределять унаследованные методы, если это позволяет язык.
Не все языки поддерживают множественное наследование. Например, Java позволяет классу реализовывать несколько интерфейсов, но наследовать только от одного класса. [ 22 ] Если разрешено множественное наследование, иерархия представляет собой ориентированный ациклический граф (или сокращенно DAG), в противном случае — дерево . В иерархии классы представлены как узлы, а отношения наследования — как ссылки. Классы одного уровня с большей вероятностью будут связаны, чем классы разных уровней. Уровни этой иерархии называются слоями или уровнями абстракции.
Пример (упрощенный код Objective-C 2.0 из iPhone SDK):
@interface UIResponder : NSObject //...
@interface UIView : UIResponder //...
@interface UIScrollView : UIView //...
@interface UITableView : UIScrollView //...
В этом примере UITableView — это UIScrollView , UIView — это UIResponder , это NSObject.
Моделирование
[ редактировать ]В объектно-ориентированном анализе и в унифицированном языке моделирования (UML) связь между двумя классами представляет собой сотрудничество между классами или их соответствующими экземплярами. Ассоциации имеют направление; например, двунаправленная связь между двумя классами указывает на то, что оба класса знают о своих отношениях. [ 23 ] Ассоциации могут быть помечены в соответствии с их названием или целью. [ 24 ]
Роль ассоциации задается в конце ассоциации и описывает роль соответствующего класса. Например, роль «подписчик» описывает, как экземпляры класса «Человек» участвуют в ассоциации «подписка» с классом «Журнал». Кроме того, «Журнал» играет роль «журнала по подписке» в той же ассоциации. Множественность ролей ассоциации описывает, сколько экземпляров соответствует каждому экземпляру другого класса ассоциации. Обычными кратностями являются «0..1», «1..1», «1..*» и «0..*», где «*» указывает любое количество экземпляров. [ 23 ]
Таксономия
[ редактировать ]Существует множество категорий классов, некоторые из которых частично совпадают.
Абстрактное и конкретное
[ редактировать ]
В языке, поддерживающем наследование, абстрактный класс или абстрактный базовый класс ( ABC ) — это класс, экземпляр которого не может быть создан напрямую. Напротив, конкретный класс — это класс, экземпляр которого можно создать напрямую. Создание экземпляра абстрактного класса может происходить только косвенно, через конкретный подкласс .
Абстрактный класс либо помечен как таковой явно, либо может просто определять абстрактные методы (или виртуальные методы ). Абстрактный класс может предоставлять реализации некоторых методов, а также может указывать виртуальные методы через сигнатуры , которые должны быть реализованы прямыми или косвенными потомками абстрактного класса. Прежде чем можно будет создать экземпляр класса, производного от абстрактного класса, все абстрактные методы его родительских классов должны быть реализованы каким-либо классом в цепочке создания. [ 25 ]
Большинство объектно-ориентированных языков программирования позволяют программисту указывать, какие классы считаются абстрактными, и не позволяют создавать их экземпляры. Например, в Java , C# и PHP ключевое слово Abstract . используется [ 26 ] [ 27 ] В C++ абстрактный класс — это класс, имеющий хотя бы один абстрактный метод, заданный соответствующим синтаксисом на этом языке (чистая виртуальная функция на языке C++). [ 25 ]
Класс, состоящий только из чисто виртуальных методов, в C++ называется чисто абстрактным базовым классом (или чистым ABC также называют его интерфейсом . ), а пользователи языка [ 13 ] Другие языки, особенно Java и C#, поддерживают вариант абстрактных классов, называемый интерфейсом, посредством ключевого слова в языке. В этих языках множественное наследование не допускается, но класс может реализовывать несколько интерфейсов. Такой класс может содержать только абстрактные общедоступные методы. [ 22 ] [ 28 ] [ 29 ]
Местное и внутреннее
[ редактировать ]В некоторых языках классы могут быть объявлены в областях, отличных от глобальной. Существуют различные типы таких занятий.
— Внутренний класс это класс, определенный внутри другого класса. Отношения между внутренним классом и содержащим его классом также можно рассматривать как другой тип ассоциации классов. Внутренний класс обычно не связан с экземплярами включающего класса и не создается вместе с включающим его классом. В зависимости от языка может быть возможно или невозможно ссылаться на класс снаружи включающего его класса. Родственное понятие — внутренние типы , также известные как внутренний тип данных или вложенный тип , который является обобщением концепции внутренних классов. C++ — это пример языка, который поддерживает как внутренние классы, так и внутренние типы (через объявления typedef ). [ 30 ] [ 31 ]
— Локальный класс это класс, определенный внутри процедуры или функции. Такая структура ограничивает ссылки на имя класса областью, в которой объявлен класс. В зависимости от семантических правил языка могут существовать дополнительные ограничения на локальные классы по сравнению с нелокальными. Одним из распространенных ограничений является запрет локальным методам класса на доступ к локальным переменным включающей функции. Например, в C++ локальный класс может ссылаться на статические переменные, функции объявленные внутри включающей его функции, но не может иметь доступ к автоматическим переменным . [ 32 ]
Метакласс
[ редактировать ]Метакласс — это класс, экземпляры которого являются классами. [ 33 ] Метакласс описывает общую структуру набора классов и может реализовывать шаблон проектирования или описывать определенные виды классов. Метаклассы часто используются для описания фреймворков . [ 34 ]
В некоторых языках, таких как Python , Ruby или Smalltalk , класс также является объектом; таким образом, каждый класс является экземпляром уникального метакласса, встроенного в язык. [ 4 ] [ 35 ] [ 36 ] Объектная система Common Lisp (CLOS) предоставляет метаобъектные протоколы (MOP) для реализации этих классов и метаклассов. [ 37 ]
Запечатанный
[ редактировать ]Запечатанный класс не может быть подклассом. По сути, это противоположность абстрактному классу, который для использования должен быть производным. Запечатанный класс неявно конкретен .
Класс, объявленный как запечатанный с помощью ключевого слова sealed
на С# или final
на Java или PHP. [ 38 ] [ 39 ] [ 40 ]
Например, Java String
класс помечен как окончательный . [ 41 ]
Запечатанные классы могут позволить компилятору выполнять оптимизации, недоступные для классов, которые могут быть подклассами. [ 42 ]
Открыть
[ редактировать ]Открытый класс можно изменить. Обычно исполняемая программа не может быть изменена пользователем. Разработчики часто могут изменять некоторые классы, но обычно не могут изменять стандартные или встроенные. В Ruby все классы открыты. В Python классы можно создавать во время выполнения, а затем все их можно изменять. [ 43 ] Категории Objective-C позволяют программисту добавлять методы в существующий класс без необходимости перекомпиляции этого класса или даже доступа к его исходному коду.
смешивание
[ редактировать ]В некоторых языках имеется специальная поддержка примесей , однако в любом языке с множественным наследованием примесь — это просто класс, который не представляет отношения типа «есть-тип». Миксины обычно используются для добавления одних и тех же методов к нескольким классам; например, класс UnicodeConversionMixin может предоставить метод под названием unicode_to_ascii при включении в классы FileReader и WebPageScraper , которые не имеют общего родительского элемента.
Частичный
[ редактировать ]В языках, поддерживающих эту функцию, частичный класс — это класс, определение которого можно разделить на несколько частей, в одном файле исходного кода или в нескольких файлах. [ 44 ] Части объединяются во время компиляции, что делает вывод компилятора таким же, как и для нечастичного класса.
Основной мотивацией введения частичных классов является облегчение реализации генераторов кода , таких как визуальные дизайнеры . [ 44 ] В противном случае разработка генераторов кода, которые смогут управлять сгенерированным кодом, когда он чередуется с кодом, написанным разработчиком, представляет собой проблему или компромисс. Используя частичные классы, генератор кода может обрабатывать отдельный файл или крупнозернистый частичный класс внутри файла и, таким образом, избавляется от сложного внедрения сгенерированного кода посредством расширенного синтаксического анализа, что повышает эффективность компилятора и устраняет потенциальный риск повреждения кода разработчика. В простой реализации разделяемых классов компилятор может выполнить этап предварительной компиляции , на котором он «объединяет» все части разделяемого класса. Затем компиляция может продолжаться как обычно.
Другие преимущества и эффекты функции частичного класса включают в себя:
- Позволяет уникальным образом разделить интерфейс класса и код реализации.
- Упрощает навигацию по большим классам в редакторе .
- Обеспечивает разделение задач аналогично аспектно-ориентированному программированию , но без использования каких-либо дополнительных инструментов.
- Позволяет нескольким разработчикам одновременно работать над одним классом без необходимости последующего объединения отдельного кода в один файл.
Частичные классы уже долгое время существуют в Smalltalk под названием «Расширения классов» . С появлением .NET framework 2 в Microsoft представила частичные классы, поддерживаемые как в C# 2.0, так и Visual Basic 2005 . WinRT также поддерживает частичные классы.
Непревзойденный
[ редактировать ]Неэкземплярные классы позволяют программистам группировать поля и методы каждого класса, которые доступны во время выполнения без экземпляра класса. Действительно, создание экземпляров для такого класса запрещено.
Например, в C# класс, помеченный как «статический», не может быть создан, может иметь только статические члены (поля, методы и т. д.), может не иметь конструкторов экземпляров и является запечатанным . [ 45 ]
Безымянный
[ редактировать ]Безымянный класс или анонимный класс не привязан к имени или идентификатору при определении. [ 46 ] [ 47 ] Это аналогично именованным и неименованным функциям .
Преимущества
[ редактировать ]Преимущества организации программного обеспечения в классы объектов делятся на три категории: [ 48 ]
- Быстрое развитие
- Простота обслуживания
- Повторное использование кода и дизайнов
Классы объектов способствуют быстрой разработке, поскольку уменьшают семантический разрыв между кодом и пользователями. Системные аналитики могут общаться как с разработчиками, так и с пользователями, используя по существу один и тот же словарный запас, обсуждая счета, клиентов, счета и т. д. Классы объектов часто способствуют быстрой разработке, поскольку большинство объектно-ориентированных сред оснащены мощными инструментами отладки и тестирования. Экземпляры классов можно проверять во время выполнения, чтобы убедиться, что система работает должным образом. Кроме того, вместо получения дампов основной памяти большинство объектно-ориентированных сред интерпретируют возможности отладки, чтобы разработчик мог точно проанализировать, где в программе произошла ошибка, и увидеть, какие методы были вызваны с какими аргументами и с какими аргументами. [ 49 ]
Классы объектов облегчают обслуживание посредством инкапсуляции. Когда разработчикам необходимо изменить поведение объекта, они могут локализовать изменение только для этого объекта и его составных частей. Это снижает вероятность нежелательных побочных эффектов от усовершенствований обслуживания.
Повторное использование программного обеспечения также является важным преимуществом использования классов объектов. Классы облегчают повторное использование посредством наследования и интерфейсов. Когда требуется новое поведение, этого часто можно достичь, создав новый класс и унаследовав этот класс поведение по умолчанию и данные своего суперкласса, а затем соответствующим образом адаптировав некоторые аспекты поведения или данных. Повторное использование через интерфейсы (также известные как методы) происходит, когда другой объект хочет вызвать (а не создать новый вид) некоторый класс объекта. Этот метод повторного использования устраняет многие распространенные ошибки, которые могут проникнуть в программное обеспечение, когда одна программа повторно использует код другой. [ 50 ]
Представление времени выполнения
[ редактировать ]Это представление времени выполнения требует дополнительных ссылок для проверки . ( май 2024 г. ) |
Класс обычно рассматривается как тип данных как конструкция времени компиляции. [ 51 ] Язык или библиотека могут также поддерживать прототипа или фабрики метаобъекты , которые представляют информацию о классах во время выполнения или даже представляют метаданные, которые обеспечивают доступ к средствам рефлексивного программирования (отражения) и возможность манипулировать форматами структур данных во время выполнения. Многие языки различают этот вид информации о типах времени выполнения о классах от класса на том основании, что эта информация не требуется во время выполнения. Некоторые динамические языки не проводят строгих различий между конструкциями времени выполнения и времени компиляции и, следовательно, могут не различать метаобъекты и классы.
Например, если Human является метаобъектом, представляющим класс Person, то экземпляры класса Person могут быть созданы с использованием возможностей метаобъекта Human .
Программирование на основе прототипов
[ редактировать ]В отличие от создания объекта из класса, некоторые контексты программирования поддерживают создание объекта путем копирования (клонирования) объекта -прототипа . [ 52 ]
См. также
[ редактировать ]- Диаграмма классов - диаграмма, описывающая статическую структуру программной системы.
- Переменная класса — переменная, определенная в классе, все объекты которого имеют одну и ту же копию.
- Переменная экземпляра — переменная-член класса, копию которого имеют все его объекты.
- Список объектно-ориентированных языков программирования
- Черта (компьютерное программирование) - набор методов, расширяющих функциональность класса.
Примечания
[ редактировать ]- ^ Гамма и др. 1995 , с. 14.
- ^ Брюс 2002 , 2.1 Объекты, классы и типы объектов, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18 .
- ^ Гамма и др. 1995 , с. 17.
- ^ Перейти обратно: а б «3. Модель данных» . Справочник по языку Python . Фонд программного обеспечения Python . Проверено 26 апреля 2012 г.
- ^ Буч 1994 , с. 86-88.
- ^ «Занятия (Я)» . Учебник по языку С++ . cplusplus.com . Проверено 29 апреля 2012 г.
- ^ «Занятия (II)» . Учебник по языку С++ . cplusplus.com . Проверено 29 апреля 2012 г.
- ^ Буч 1994 , с. 105.
- ^ Джамрич, Парсонс, июнь (22 июня 2015 г.). Новые перспективы компьютерных концепций, 2016. Комплексное . Бостон, Массачусетс. ISBN 9781305271616 . OCLC 917155105 .
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ) CS1 maint: несколько имен: список авторов ( ссылка ) - ^ Перейти обратно: а б «Контроль доступа к членам класса» . Учебники по Java . Оракул . Проверено 19 апреля 2012 г.
- ^ «OOP08-CPP. Не возвращать ссылки на частные данные» . CERT Стандарт безопасного кодирования C++ . Университет Карнеги-Меллон. 10 мая 2010 г. Архивировано из оригинала 3 октября 2015 г. Проверено 7 мая 2012 г.
- ^ Бен-Ари, Мордехай (24 января 2007 г.). «2.2 Идентификаторы» (PDF) . Ошибки компиляции и выполнения в Java . Архивировано (PDF) из оригинала 18 октября 2011 г. Проверено 7 мая 2012 г.
- ^ Перейти обратно: а б Дикий, Фред. «Интерфейсы C++» . Доктор Добб . УБМ Техвеб . Проверено 2 мая 2012 г.
- ^ Томас; Хант. «Классы, объекты и переменные» . Программирование на Ruby: Руководство прагматичного программиста . Руби-Док.org . Проверено 26 апреля 2012 г.
- ^ «Дружба и наследство» . Учебник по языку С++ . cplusplus.com . Проверено 26 апреля 2012 г.
- ^ Берфельд, Мария (2 декабря 2008 г.). «Преобразование UML в Java в выпусках IBM Rational Software Architect и сопутствующем программном обеспечении» . ИБМ . Проверено 20 декабря 2013 г.
- ^ Якобсен, Ивар; Магнус Кристерсон; Патрик Йонссон; Гуннар Овергаард (1992). Объектно-ориентированная разработка программного обеспечения . Аддисон-Уэсли ACM Press. стр. 43–69 . ISBN 0-201-54435-0 .
- ^ Кнублаух, Хольгер; Оберле, Дэниел; Тетлоу, Фил; Уоллес, Эван (9 марта 2006 г.). «Учебник по семантической сети для разработчиков объектно-ориентированного программного обеспечения» . W3C . Проверено 30 июля 2008 г.
- ^ Буч 1994 , с. 180.
- ^ Буч 1994 , с. 128-129.
- ^ Буч 1994 , с. 112.
- ^ Перейти обратно: а б «Интерфейсы» . Учебники по Java . Оракул . Проверено 1 мая 2012 г.
- ^ Перейти обратно: а б Белл, Дональд. «Основы UML: диаграмма классов» . разработчик работает . ИБМ . Проверено 2 мая 2012 г.
- ^ Буч 1994 , с. 179.
- ^ Перейти обратно: а б «Полиморфизм» . Учебник по языку С++ . cplusplus.com . Проверено 2 мая 2012 г.
- ^ «Абстрактные методы и классы» . Учебники по Java . Оракул . Проверено 2 мая 2012 г.
- ^ «Абстракция классов» . Руководство по PHP . Группа PHP . Проверено 2 мая 2012 г.
- ^ «Интерфейсы (Руководство по программированию на C#)» . Руководство по программированию на C# . Майкрософт . Проверено 15 августа 2013 г.
- ^ «Наследование (Руководство по программированию на C#)» . Руководство по программированию на C# . Майкрософт . Проверено 2 мая 2012 г.
- ^ «Вложенные классы (только C++)» . XL C/C++ V8.0 для AIX . ИБМ . Проверено 7 мая 2012 г.
- ^ «Имена локальных типов (только C++)» . XL C/C++ V8.0 для AIX . ИБМ . Проверено 7 мая 2012 г.
- ^ «Локальные классы (только C++)» . XL C/C++ V8.0 для AIX . ИБМ . Проверено 7 мая 2012 г.
- ^ Буч 1994 , с. 133-134.
- ^ «13 классов и метаклассов» . pharo.gforge.inria.fr . Архивировано из оригинала 24 февраля 2021 г. Проверено 31 октября 2016 г.
- ^ Томас; Хант. «Классы и объекты» . Программирование на Ruby: Руководство прагматичного программиста . Руби-Док.org . Проверено 8 мая 2012 г.
- ^ Буч 1994 , с. 134.
- ^ «СС: Концепции» . Протокол метаобъектов Common Lisp Object System . Ассоциация пользователей Лиспа. Архивировано из оригинала 15 ноября 2010 г. Проверено 8 мая 2012 г.
- ^ «запечатанный (Справочник по C#)» . Справочник по С# . Майкрософт . Проверено 8 мая 2012 г.
- ^ «Написание финальных классов и методов» . Учебники по Java . Оракул . Проверено 8 мая 2012 г.
- ^ «PHP: последнее ключевое слово» . Руководство по PHP . Группа PHP . Проверено 21 августа 2014 г.
- ^ «Строка (платформа Java SE 7)» . Платформа Java, стандартная версия 7: Спецификация API . Оракул . Проверено 8 мая 2012 г.
- ^ Брэнд, Си (2 марта 2020 г.). «Преимущества выпускных занятий» . Блог команды Microsoft C++ . Майкрософт . Проверено 4 апреля 2020 г.
- ^ «9. Занятия» . Учебник по Python . Python.org . Проверено 3 марта 2018 г.
Как и в случае с модулями, классы имеют динамическую природу Python: они создаются во время выполнения и могут быть изменены после создания.
- ^ Перейти обратно: а б майро; БиллВагнер; tompratt-AQ (19 сентября 2015 г.), «Частичные классы и методы» , Руководство по программированию на C# , Microsoft , получено 8 августа 2018 г.
- ^ «Статические классы и члены статических классов (Руководство по программированию на C#)» . Руководство по программированию на C# . Майкрософт . Проверено 8 мая 2012 г.
- ^ «Анонимные классы (Учебные пособия по Java > Изучение языка Java > Классы и объекты)» . docs.oracle.com . Проверено 13 мая 2021 г.
- ^ «PHP: Анонимные классы — Руководство» . www.php.net . Проверено 11 августа 2021 г.
- ^ «Что такое объект?» . oracle.com . Корпорация Оракл . Проверено 13 декабря 2013 г.
- ^ Буч, Грейди; Роберт А. Максимчук; Майкл В. Энгл; Бобби Дж. Янг, доктор философии; Джим Коналлен; Келли А. Хьюстон (30 апреля 2007 г.). Объектно-ориентированный анализ и проектирование с приложениями . Аддисон-Уэсли Профессионал. стр. 1–28. ISBN 978-0-201-89551-3 . Проверено 20 декабря 2013 г.
Существуют фундаментальные ограничивающие факторы человеческого познания; мы можем устранить эти ограничения с помощью декомпозиции, абстракции и иерархии.
- ^ Якобсен, Ивар; Магнус Кристерсон; Патрик Йонссон; Гуннар Овергаард (1992). Объектно-ориентированная разработка программного обеспечения . Аддисон-Уэсли ACM Press. ISBN 0-201-54435-0 .
- ^ «Международный стандарт C++» (PDF) . Рабочий проект стандарта языка программирования C++ . ISO/IEC JTC1/SC22 WG21. Архивировано (PDF) из оригинала 9 декабря 2017 г. Проверено 5 января 2020 г.
- ^ Амир, Масрур (25 марта 2023 г.). «ООП — Объектно-ориентированное программирование — Концепции | Языки | Преимущества [2023]» . Бот Geeks | Сайт компьютерных наук для компьютерных фанатов . Проверено 4 апреля 2023 г.
Ссылки
[ редактировать ]- Буч, Грейди (1994). Объекты и дизайн с приложениями, второе издание . Бенджамин/Каммингс.
- Гамма; Шлем; Джонсон; Влиссидес (1995). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Эддисон Уэсли. ISBN 9780201633610 .
- Брюс, Ким Б. (2002). Основы объектно-ориентированных языков: типы и семантика . Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-02523-2 .
Дальнейшее чтение
[ редактировать ]- Абади; Карделли: теория объектов
- ISO/IEC 14882:2003 Язык программирования C++, международный стандарт.
- Классовая война: классы против прототипов , Брайан Фут
- Мейер, Б.: «Объектно-ориентированное создание программного обеспечения», 2-е издание, Prentice Hall, 1997. ISBN 0-13-629155-4
- Рамбо и др.: «Объектно-ориентированное моделирование и проектирование», Прентис Холл, 1991, ISBN 0-13-630054-5