Класс (компьютерное программирование)
В объектно-ориентированном программировании класс — это расширяемый шаблон программного кода для создания объектов , предоставляющий начальные значения состояния ( переменные-члены ) и реализации поведения (функции-члены или методы ). [1] [2] [а]
Когда объект создается конструктором класса, результирующий объект называется экземпляром класса , а переменные-члены, специфичные для объекта, называются переменными экземпляра , в отличие от переменных класса, общих для всего класса.
В некоторых языках программирования классы доступны только во время компиляции (новые классы не могут быть объявлены во время выполнения ). В других языках классы являются первоклассными гражданами и обычно являются объектами (обычно типа Класс или что-то подобное). В этих языках класс, создающий классы внутри себя, называется метаклассом .
Связанные понятия [ править ]
Экземпляр [ править ]
В объектно-ориентированном программировании (ООП) экземпляр — это конкретное появление любого объекта , обычно существующего во время выполнения компьютерной программы. Формально «экземпляр» является синонимом «объекта», поскольку каждый из них представляет собой определенное значение (реализацию), и их можно назвать экземплярным объектом; «экземпляр» подчеркивает отчетливую идентичность объекта. Создание экземпляра называется созданием экземпляра.
Объект может быть изменен по-разному. Каждая реализованная вариация этого объекта является экземпляром своего класса. То есть это член данного класса, который имеет указанные значения, а не переменные . В контексте, не связанном с программированием, вы можете думать о «собаке» как о типе, а о вашей конкретной собаке как об экземпляре этого класса. [3]
В программировании на основе классов объекты создаются как экземпляры классов с помощью подпрограмм, называемых конструкторами , и уничтожаются деструкторами . Объект является экземпляром класса, поскольку он может получить доступ ко всем типам данных (примитивным и не примитивным), методам и т. д. класса. Следовательно, объекты можно называть экземплярами класса или объектами класса. Создание экземпляра объекта называется конструкцией. Не все классы могут быть созданы — абстрактные классы не могут быть созданы, а классы, экземпляры которых могут быть созданы, называются конкретными классами . В программировании на основе прототипов создание экземпляра вместо этого выполняется путем копирования (клонирования) экземпляра прототипа. [4]
Класс против типа [ править ]
В самом обычном использовании люди часто ссылаются на «класс» объекта, но, строго говоря, объекты имеют тип : интерфейс, а именно типы переменных-членов, сигнатуры функций-членов (методов) и свойств, которым они удовлетворяют. В то же время класс имеет реализацию (точнее реализацию методов) и может создавать объекты заданного типа с заданной реализацией. [5] С точки зрения теории типов, класс — это реализация — « конкретная структура данных и набор подпрограмм», — а тип — это интерфейс . Разные (конкретные) классы могут создавать объекты одного и того же (абстрактного) типа (в зависимости от системы типов); например, тип Стек может быть реализован с помощью двух классов: SmallStack (быстро для небольших стеков, но плохо масштабируется) и ScalableStack (хорошо масштабируется, но требует больших затрат для небольших стеков). Аналогично, данный класс может иметь несколько разных конструкторов.
Типы классов обычно представляют существительные, такие как человек, место или предмет, или что-то номинализированное , а класс представляет собой их реализацию. Например, Тип банана может отражать свойства и функциональность бананов в целом, тогда как ABCБанан и Классы XYZBanana будут представлять способы производства бананов (скажем, поставщиков бананов или структуры данных и функции для представления и рисования бананов в видеоигре). Класс ABCBanana затем мог бы создавать определенные бананы: экземпляры Класс ABCBanana будет объектом типа Банан . Часто дается только одна реализация типа, и в этом случае имя класса часто совпадает с именем типа.
Проектирование и реализация [ править ]
Занятия состоят из структурных и поведенческих компонентов. [1] Языки программирования, включающие классы в качестве программной конструкции, обеспечивают поддержку различных функций, связанных с классами, а синтаксис, необходимый для использования этих функций, сильно варьируется от одного языка программирования к другому.
Структура [ править ]
Класс содержит данных полей описания (или свойств , полей , данных членов или атрибутов ). Обычно это типы и имена полей, которые будут связаны с переменными состояния во время выполнения программы; эти переменные состояния принадлежат либо классу, либо конкретным экземплярам класса. В большинстве языков структура, определенная классом, определяет расположение памяти, используемой его экземплярами. Возможны и другие реализации: например, объекты в Python используют ассоциативные контейнеры «ключ-значение». [6]
Некоторые языки программирования, такие как Eiffel, поддерживают спецификацию инвариантов как часть определения класса и реализуют их через систему типов. Инкапсуляция состояния необходима для обеспечения соблюдения инвариантов класса.
Поведение [ править ]
Поведение класса или его экземпляров определяется с помощью методов . Методы — это подпрограммы , способные работать с объектами или классами. Эти операции могут изменить состояние объекта или просто предоставить способы доступа к нему. [7] Существует множество видов методов, но их поддержка различается в зависимости от языка. Некоторые типы методов создаются и вызываются программным кодом, тогда как другие специальные методы, такие как конструкторы, деструкторы и операторы преобразования, создаются и вызываются кодом, сгенерированным компилятором. Язык также может позволять программисту определять и вызывать эти специальные методы. [8] [9]
Интерфейс класса [ править ]
Каждый класс реализует (или реализует ) интерфейс, предоставляя структуру и поведение. Структура состоит из данных и состояния, а поведение состоит из кода, определяющего реализацию методов. [10] Существует различие между определением интерфейса и реализацией этого интерфейса; однако во многих языках программирования эта грань размыта, поскольку объявления классов одновременно определяют и реализуют интерфейс. Однако некоторые языки предоставляют функции, разделяющие интерфейс и реализацию. Например, абстрактный класс может определять интерфейс без предоставления реализации.
Языки, поддерживающие наследование классов, также позволяют классам наследовать интерфейсы от классов, от которых они произошли.
Например, если «класс A» наследуется от «класса B» и если «класс B» реализует интерфейс «интерфейс B», то «класс A» также наследует функциональность (объявление констант и методов), предоставляемую «интерфейсом B».
В языках, поддерживающих спецификаторы доступа , интерфейс класса считается набором открытых членов класса, включая как методы, так и атрибуты (посредством неявных методов получения и установки ); любые частные члены или внутренние структуры данных не предназначены для зависимости от внешнего кода и, следовательно, не являются частью интерфейса.
Методология объектно-ориентированного программирования требует, чтобы операции любого интерфейса класса были независимы друг от друга. В результате получается многоуровневая конструкция, в которой клиенты интерфейса используют методы, объявленные в интерфейсе. Интерфейс не предъявляет клиентам требований к вызову операций одного интерфейса в каком-либо определенном порядке. Преимущество этого подхода заключается в том, что клиентский код может предполагать, что операции интерфейса доступны для использования всякий раз, когда клиент имеет доступ к объекту. [11] [ нужна ссылка ]
- Пример интерфейса класса
Кнопки на передней панели телевизора — это интерфейс между вами и электропроводкой на другой стороне пластикового корпуса. Вы нажимаете кнопку «питание», чтобы включать и выключать телевизор. В этом примере экземпляром является ваш конкретный телевизор, каждый метод представлен кнопкой, а все кнопки вместе составляют интерфейс (другие телевизоры той же модели, что и ваш, будут иметь тот же интерфейс). В своей наиболее распространенной форме интерфейс представляет собой спецификацию группы связанных методов без какой-либо связанной реализации этих методов.
Телевизор также имеет множество атрибутов , таких как размер и поддержка цвета, которые вместе составляют его структуру. Класс представляет собой полное описание телевизора, включая его атрибуты (структуру) и кнопки (интерфейс).
Получение общего количества выпущенных телевизоров может быть статическим методом класса телевизоров. Этот метод связан с классом, но находится за пределами домена каждого экземпляра класса. Другим примером является статический метод, который находит конкретный экземпляр из множества всех телевизионных объектов.
Доступность для участников [ править ]
Ниже приведен общий набор спецификаторов доступа : [12]
- Private (или class-private ) ограничивает доступ к самому классу. Доступ к закрытым членам могут иметь только методы, являющиеся частью одного и того же класса.
- Protected (или class-protected ) позволяет самому классу и всем его подклассам получать доступ к члену.
- Открытость означает, что любой код может получить доступ к элементу по его имени.
Хотя многие объектно-ориентированные языки поддерживают указанные выше спецификаторы доступа, их семантика может отличаться.
Объектно-ориентированное проектирование использует спецификаторы доступа в сочетании с тщательным проектированием реализаций общедоступных методов для обеспечения соблюдения инвариантов классов — ограничений на состояние объектов. Спецификаторы доступа обычно используются для отделения внутренних данных класса от его интерфейса: внутренняя структура становится частной, а общедоступные методы доступа могут использоваться для проверки или изменения таких частных данных.
Спецификаторы доступа не обязательно контролируют видимость , поскольку даже частные члены могут быть видны внешнему коду клиента. В некоторых языках на недоступный, но видимый элемент можно ссылаться во время выполнения (например, с помощью указателя, возвращаемого функцией-членом), но попытка использовать его путем ссылки на имя элемента из клиентского кода будет предотвращена. с помощью средства проверки типов. [13]
языка Различные объектно-ориентированные языки программирования обеспечивают доступность и видимость членов в разной степени и, в зависимости от системы типов и политики компиляции, реализуются либо во время компиляции , либо во время выполнения . Например, язык Java не позволяет компилировать клиентский код, который обращается к частным данным класса. [14] В языке C++ частные методы видимы, но недоступны в интерфейсе; однако их можно сделать невидимыми, явно объявив полностью абстрактные классы, которые представляют интерфейсы класса. [15]
В некоторых языках предусмотрены другие схемы доступности:
- Доступность экземпляра и класса : Ruby поддерживает спецификаторы доступа , частные и защищенные экземпляром , вместо частных и защищенных классом соответственно. Они отличаются тем, что ограничивают доступ на основе самого экземпляра, а не класса экземпляра. [16]
- Friend : C++ поддерживает механизм, при котором функция, явно объявленная как дружественная функция класса, может обращаться к членам, обозначенным как частные или защищенные. [17]
- На основе пути : Java поддерживает ограничение доступа к элементу внутри пакета Java , который является логическим путем к файлу. Однако при расширении платформы Java распространенной практикой является реализация классов в том же пакете, что и класс платформы, для доступа к защищенным членам. Исходный файл может существовать в совершенно другом месте и может быть развернут в другом файле .jar, но при этом находиться в том же логическом пути, что касается JVM. [12]
Межклассовые отношения [ править ]
Помимо разработки автономных классов, языки программирования могут поддерживать более сложные конструкции классов, основанные на отношениях между классами. Обычно предоставляемые возможности проектирования межклассовых отношений являются композиционными и иерархическими .
Композиционный [ править ]
Классы могут состоять из других классов, тем самым устанавливая композиционные отношения между включающим их классом и его встроенными классами. Композиционные отношения между классами также широко известны как отношения «имеет» . [18] Например, класс «Автомобиль» может состоять из класса «Двигатель» и содержать его. Следовательно, у автомобиля есть двигатель. Одним из аспектов композиции является включение, то есть включение экземпляров компонента в экземпляр, который их содержит. Если включающий объект содержит экземпляры компонентов по значению, компоненты и их включающий объект имеют одинаковое время жизни . Если компоненты содержатся посредством ссылки, они могут иметь разный срок службы. [19] Например, в Objective-C 2.0:
@interface Car : NSObject
@property NSString *name;
@property Engine *engine
@property NSArray *tires;
@end
Этот автомобиля Класс имеет экземпляр NSString ( строковый объект), Двигатель и NSArray (объект массива).
Иерархический [ править ]
Классы могут быть производными от одного или нескольких существующих классов, тем самым устанавливая иерархические отношения между производными классами ( базовыми классами , родительскими классами или суперклассы ) и производный класс ( дочерний класс или подкласс ). Отношения производного класса с производными классами широко известны как отношения is-a . [20] Например, класс «Кнопка» может быть производным от класса «Control». Следовательно, кнопка — это элемент управления. Структурные и поведенческие члены родительских классов наследуются дочерним классом. Производные классы могут определять дополнительные структурные элементы (поля данных) и поведенческие элементы (методы) в дополнение к тем, которые они наследуют , и, следовательно, являются специализациями своих суперклассов. Кроме того, производные классы могут переопределять унаследованные методы, если это позволяет язык.
Не все языки поддерживают множественное наследование. Например, Java позволяет классу реализовывать несколько интерфейсов, но наследовать только от одного класса. [21] Если разрешено множественное наследование, иерархия представляет собой ориентированный ациклический граф (или сокращенно DAG), в противном случае — дерево . В иерархии классы представлены как узлы, а отношения наследования — как ссылки. Классы одного уровня с большей вероятностью будут связаны, чем классы разных уровней. Уровни этой иерархии называются слоями или уровнями абстракции.
Пример (упрощенный код Objective-C 2.0 из iPhone SDK):
@interface UIResponder : NSObject //...
@interface UIView : UIResponder //...
@interface UIScrollView : UIView //...
@interface UITableView : UIScrollView //...
В этом примере UITableView — это UIScrollView , UIView — это UIResponder , это NSObject.
Определения подкласса [ править ]
Концептуально суперкласс — это надмножество своих подклассов. Например, общая иерархия классов будет включать GraphicObject как суперкласс Прямоугольник и Эллипс , в то время как Square будет подклассом Прямоугольник . Все это отношения подмножеств и в теории множеств, т. е. все квадраты являются прямоугольниками, но не все прямоугольники являются квадратами.
Распространенной концептуальной ошибкой является ошибочное принятие части отношения за подкласс. Например, легковой и грузовой автомобили являются видами транспортных средств, и было бы целесообразно смоделировать их как подклассы класса транспортных средств. Однако было бы ошибкой моделировать части автомобиля как отношения подклассов. Например, автомобиль состоит из двигателя и кузова, но было бы нецелесообразно моделировать двигатель или кузов как подкласс автомобиля.
В объектно-ориентированном моделировании такие отношения обычно моделируются как свойства объекта. В этом примере Класс автомобиля будет иметь свойство под названием части . части будут типизированы для хранения коллекции объектов, таких как экземпляры Тело , Двигатель , Шины и т. д. Языки объектного моделирования, такие как UML, включают возможности моделирования различных аспектов «части» и других видов отношений — таких данных, как мощность объектов, ограничения на входные и выходные значения и т. д. Эта информация может использоваться инструментами разработчика для генерировать дополнительный код помимо основных определений данных для объектов, например проверку ошибок в методах get и set . [22]
Одним из важных вопросов при моделировании и реализации системы объектных классов является то, может ли класс иметь один или несколько суперклассов. В реальном мире с реальными наборами редко можно найти наборы, которые не пересекаются более чем с одним другим набором. Однако, хотя некоторые системы, такие как Flavors и CLOS, предоставляют возможность более чем одному родителю делать это во время выполнения, это вносит сложность, которую многие в объектно-ориентированном сообществе считают противоположной целям использования объектных классов в первую очередь. Понимание того, какой класс будет отвечать за обработку сообщения, может оказаться сложным при работе с несколькими суперклассами. При небрежном использовании эта функция может привести к некоторым из тех же классов сложности системы и неоднозначности, которых следует избегать. [23]
Большинство современных объектно-ориентированных языков, таких как Smalltalk и Java, требуют одинарного наследования во время выполнения. Для этих языков множественное наследование может быть полезно для моделирования, но не для реализации.
Однако объекты семантического веб- приложения имеют несколько суперклассов. Нестабильность Интернета требует такого уровня гибкости, и технологические стандарты, такие как язык веб-онтологии (OWL), предназначены для его поддержки.
Аналогичная проблема заключается в том, можно ли изменить иерархию классов во время выполнения. Такие языки, как Flavors, CLOS и Smalltalk, поддерживают эту функцию как часть своих метаобъектных протоколов . Поскольку классы сами по себе являются первоклассными объектами, их структуру можно динамически изменять, отправляя им соответствующие сообщения. Другие языки, в которых больше внимания уделяется строгой типизации, например Java и C++, не позволяют изменять иерархию классов во время выполнения. Объекты семантической сети имеют возможность вносить изменения в классы во время выполнения. Обоснование аналогично обоснованию разрешения нескольких суперклассов: Интернет настолько динамичен и гибок, что для управления этой нестабильностью требуются динамические изменения в иерархии. [24]
Ортогональность концепции класса и наследование [ править ]
Хотя обычно считается, что языки на основе классов поддерживают наследование, наследование не является неотъемлемым аспектом концепции классов. Некоторые языки, часто называемые « объектно-ориентированными языками », поддерживают классы, но не поддерживают наследование. Примеры объектно-ориентированных языков включают более ранние версии Visual Basic .
В рамках объектно-ориентированного анализа [ править ]
В объектно-ориентированном анализе и в унифицированном языке моделирования (UML) связь между двумя классами представляет собой сотрудничество между классами или их соответствующими экземплярами. Ассоциации имеют направление; например, двунаправленная связь между двумя классами указывает на то, что оба класса знают о своих отношениях. [25] Ассоциации могут быть помечены в соответствии с их названием или целью. [26]
Роль ассоциации задается в конце ассоциации и описывает роль соответствующего класса. Например, роль «подписчик» описывает, как экземпляры класса «Человек» участвуют в ассоциации «подписка» с классом «Журнал». Кроме того, «Журнал» играет роль «журнала по подписке» в той же ассоциации. Множественность ролей ассоциации описывает, сколько экземпляров соответствует каждому экземпляру другого класса ассоциации. Обычными кратностями являются «0..1», «1..1», «1..*» и «0..*», где «*» указывает любое количество экземпляров. [25]
Таксономия классов [ править ]
Существует множество категорий классов, некоторые из которых частично совпадают.
Абстрактное и конкретное [ править ]
В языке, поддерживающем наследование, абстрактный класс или абстрактный базовый класс ( ABC ) — это класс, экземпляр которого не может быть создан напрямую. Напротив, конкретный класс — это класс, экземпляр которого можно создать напрямую. Создание экземпляра абстрактного класса может происходить только косвенно, через конкретный подкласс .
Абстрактный класс либо помечен как таковой явно, либо может просто определять абстрактные методы (или виртуальные методы ). Абстрактный класс может предоставлять реализации некоторых методов, а также может указывать виртуальные методы через сигнатуры , которые должны быть реализованы прямыми или косвенными потомками абстрактного класса. Прежде чем можно будет создать экземпляр класса, производного от абстрактного класса, все абстрактные методы его родительских классов должны быть реализованы каким-либо классом в цепочке создания. [27]
Большинство объектно-ориентированных языков программирования позволяют программисту указывать, какие классы считаются абстрактными, и не позволяют создавать их экземпляры. Например, в Java , C# и PHP ключевое слово Abstract . используется [28] [29] В C++ абстрактный класс — это класс, имеющий хотя бы один абстрактный метод, заданный соответствующим синтаксисом на этом языке (чистая виртуальная функция на языке C++). [27]
Класс, состоящий только из чисто виртуальных методов, в C++ называется чисто абстрактным базовым классом (или чистым ABC также называют его интерфейсом . ), а пользователи языка [15] Другие языки, особенно Java и C#, поддерживают вариант абстрактных классов, называемый интерфейсом, посредством ключевого слова в языке. В этих языках множественное наследование не допускается, но класс может реализовывать несколько интерфейсов. Такой класс может содержать только абстрактные общедоступные методы. [21] [30] [31]
Локальный и внутренний [ править ]
В некоторых языках классы могут быть объявлены в областях, отличных от глобальной. Существуют различные типы таких занятий.
— Внутренний класс это класс, определенный внутри другого класса. Отношения между внутренним классом и содержащим его классом также можно рассматривать как другой тип ассоциации классов. Внутренний класс обычно не связан с экземплярами включающего класса и не создается вместе с включающим его классом. В зависимости от языка может быть возможно или невозможно ссылаться на класс снаружи включающего его класса. Родственное понятие — внутренние типы , также известные как внутренний тип данных или вложенный тип , который является обобщением концепции внутренних классов. C++ — это пример языка, который поддерживает как внутренние классы, так и внутренние типы (через объявления typedef ). [32] [33]
Другой тип — локальный класс , который представляет собой класс, определенный внутри процедуры или функции. Это ограничивает ссылки на имя класса областью, в которой объявлен класс. В зависимости от семантических правил языка могут существовать дополнительные ограничения на локальные классы по сравнению с нелокальными. Одним из распространенных ограничений является запрет локальным методам класса на доступ к локальным переменным включающей функции. Например, в C++ локальный класс может ссылаться на статические переменные, функции объявленные внутри включающей его функции, но не может иметь доступ к автоматическим переменным . [34]
Метаклассы [ править ]
Метаклассы — это классы, экземпляры которых являются классами. [35] Метакласс описывает общую структуру набора классов и может реализовывать шаблон проектирования или описывать определенные виды классов. Метаклассы часто используются для описания фреймворков . [36]
В некоторых языках, таких как Python , Ruby или Smalltalk , класс также является объектом; таким образом, каждый класс является экземпляром уникального метакласса, встроенного в язык. [6] [37] [38] Объектная система Common Lisp (CLOS) предоставляет метаобъектные протоколы (MOP) для реализации этих классов и метаклассов. [39]
Не подклассифицированный (или запечатанный) [ править ]
Классы, не подклассифицируемые или запечатанные классы, позволяют программистам создавать классы и иерархии классов, где на каком-то уровне иерархии дальнейшее наследование запрещено (отдельный класс также может быть обозначен как не подклассируемый, что предотвращает формирование любой иерархии). . Сравните это с абстрактными классами, которые вообще подразумевают, поощряют и требуют использования производных. Класс, не подклассифицируемый, неявно конкретен .
Класс, не поддающийся подклассам, создается путем объявления класса как sealed
на С# или как final
на Java или PHP. [40] [41] [42] Например, Java String
класс обозначен как окончательный . [43]
Классы, не подклассифицируемые, могут позволить компилятору (в компилируемых языках) выполнять оптимизации, недоступные для подклассов. [44]
Открытый урок [ править ]
Открытый класс можно изменить. Обычно исполняемая программа не может быть изменена пользователем. Разработчики часто могут изменять некоторые классы, но обычно не могут изменять стандартные или встроенные. В Ruby все классы открыты. В Python классы можно создавать во время выполнения, а затем все их можно изменять. [45] Категории Objective-C позволяют программисту добавлять методы в существующий класс без необходимости перекомпиляции этого класса или даже доступа к его исходному коду.
Миксины [ править ]
В некоторых языках имеется специальная поддержка примесей , однако в любом языке с множественным наследованием примесь — это просто класс, который не представляет отношения типа «есть-тип». Миксины обычно используются для добавления одних и тех же методов к нескольким классам; например, класс UnicodeConversionMixin может предоставить метод под названием unicode_to_ascii при включении в классы FileReader и WebPageScraper , которые не имеют общего родительского элемента.
Частично [ править ]
В языках, поддерживающих эту функцию, частичный класс — это класс, определение которого можно разделить на несколько частей, в одном файле исходного кода или в нескольких файлах. [46] Части объединяются во время компиляции, что делает вывод компилятора таким же, как и для нечастичного класса.
Основной мотивацией введения частичных классов является облегчение реализации генераторов кода , таких как визуальные дизайнеры . [46] В противном случае разработка генераторов кода, которые смогут управлять сгенерированным кодом, когда он чередуется с кодом, написанным разработчиком, представляет собой проблему или компромисс. Используя частичные классы, генератор кода может обрабатывать отдельный файл или крупнозернистый частичный класс внутри файла и, таким образом, избавляется от сложного внедрения сгенерированного кода посредством расширенного синтаксического анализа, что повышает эффективность компилятора и устраняет потенциальный риск повреждения кода разработчика. В простой реализации разделяемых классов компилятор может выполнить этап предварительной компиляции , на котором он «объединяет» все части частичного класса. Затем компиляция может продолжаться как обычно.
Другие преимущества и эффекты функции частичного класса включают в себя:
- Позволяет уникальным образом разделить интерфейс класса и код реализации.
- Упрощает навигацию по большим классам в редакторе .
- Обеспечивает разделение задач аналогично аспектно-ориентированному программированию , но без использования каких-либо дополнительных инструментов.
- Позволяет нескольким разработчикам одновременно работать над одним классом без необходимости последующего объединения отдельного кода в один файл.
Частичные классы уже долгое время существуют в Smalltalk под названием «Расширения классов» . С появлением .NET framework 2 в Microsoft представила частичные классы, поддерживаемые как в C# 2.0, так и Visual Basic 2005 . WinRT также поддерживает частичные классы.
Невозможно [ править ]
Неэкземплярные классы позволяют программистам группировать поля и методы каждого класса, которые доступны во время выполнения без экземпляра класса. Действительно, создание экземпляров для такого класса запрещено.
Например, в C# класс, помеченный как «статический», не может быть создан, может иметь только статические члены (поля, методы и т. д.), может не иметь конструкторов экземпляров и является запечатанным . [47]
Безымянный [ править ]
Безымянный класс или анонимный класс — это класс, который не привязан к имени или идентификатору при определении. [48] [49] Это аналогично именованным и неименованным функциям .
Преимущества [ править ]
Преимущества организации программного обеспечения в классы объектов делятся на три категории: [50]
- Быстрое развитие
- Простота обслуживания
- Повторное использование кода и дизайнов
Классы объектов способствуют быстрой разработке, поскольку уменьшают семантический разрыв между кодом и пользователями. Системные аналитики могут общаться как с разработчиками, так и с пользователями, используя по существу один и тот же словарный запас, обсуждая счета, клиентов, счета и т. д. Классы объектов часто способствуют быстрой разработке, поскольку большинство объектно-ориентированных сред оснащены мощными инструментами отладки и тестирования. Экземпляры классов можно проверять во время выполнения, чтобы убедиться, что система работает должным образом. Кроме того, вместо получения дампов основной памяти большинство объектно-ориентированных сред интерпретируют возможности отладки, чтобы разработчик мог точно проанализировать, где в программе произошла ошибка, и увидеть, какие методы были вызваны с какими аргументами и с какими аргументами. [51]
Классы объектов облегчают обслуживание посредством инкапсуляции. Когда разработчикам необходимо изменить поведение объекта, они могут локализовать изменение только для этого объекта и его составных частей. Это снижает вероятность нежелательных побочных эффектов от усовершенствований обслуживания.
Повторное использование программного обеспечения также является важным преимуществом использования классов объектов. Классы облегчают повторное использование посредством наследования и интерфейсов. Когда требуется новое поведение, этого часто можно достичь, создав новый класс и наследующий этому классу поведение и данные по умолчанию своего суперкласса, а затем соответствующим образом адаптировав некоторые аспекты поведения или данных. Повторное использование через интерфейсы (также известные как методы) происходит, когда другой объект хочет вызвать (а не создать новый вид) некоторый класс объекта. Этот метод повторного использования устраняет многие распространенные ошибки, которые могут проникнуть в программное обеспечение, когда одна программа повторно использует код другой. [52]
Представление во время выполнения [ править ]
Это представление времени выполнения требует дополнительных ссылок для проверки . ( май 2024 г. ) |
Класс обычно рассматривается как тип данных как конструкция времени компиляции. [53] Язык или библиотека могут также поддерживать прототипа или фабрики метаобъекты , которые представляют информацию о классах во время выполнения или даже представляют метаданные, которые обеспечивают доступ к средствам рефлексивного программирования (отражения) и возможность манипулировать форматами структур данных во время выполнения. Многие языки различают этот вид информации о типах времени выполнения о классах от класса на том основании, что эта информация не требуется во время выполнения. Некоторые динамические языки не проводят строгих различий между конструкциями времени выполнения и времени компиляции и, следовательно, могут не различать метаобъекты и классы.
Например, если Human является метаобъектом, представляющим класс Person, то экземпляры класса Person могут быть созданы с использованием возможностей метаобъекта Human .
См. также [ править ]
- Программирование на основе классов
- Диаграмма классов (UML)
- Список объектно-ориентированных языков программирования
- смешивание
- Объектно-ориентированное программирование
- Программирование на основе прототипов
- Черта (компьютерное программирование)
Примечания [ править ]
- ^ Во многих языках имя класса используется как имя класса (сам шаблон), имя конструктора класса по умолчанию ( подпрограмма , создающая объекты) и как тип объектов, генерируемых путем создания экземпляра класса. ; эти различные понятия легко объединить. [2] Хотя, вплоть до смешения, можно утверждать, что это особенность, присущая языку из-за его полиморфной природы и того, почему такие языки настолько мощны, динамичны и адаптируемы для использования по сравнению с языками без присутствия полиморфизма. Таким образом, им легче моделировать динамические системы (т. е. реальный мир, машинное обучение, искусственный интеллект).
- ^ Перейти обратно: а б Гамма и др. 1995 , с. 14.
- ^ Перейти обратно: а б Брюс 2002 , 2.1 Объекты, классы и типы объектов, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18 .
- ^ «Что такое экземпляр? – Определение с сайта WhatIs.com» . Whatis.techtarget.com . Проверено 9 февраля 2014 г.
- ^ Амир, Масрур (25 марта 2023 г.). «ООП — Объектно-ориентированное программирование — Концепции | Языки | Преимущества [2023]» . Бот Geeks | Сайт компьютерных наук для компьютерных фанатов . Проверено 4 апреля 2023 г.
- ^ Гамма и др. 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 г.
- ^ Буч 1994 , с. 180.
- ^ Буч 1994 , с. 128-129.
- ^ Буч 1994 , с. 112.
- ^ Перейти обратно: а б «Интерфейсы» . Учебники по Java . Оракул . Проверено 1 мая 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 г.
- ^ Перейти обратно: а б Белл, Дональд. «Основы 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 г.
Ссылки [ править ]
- Буч, Грейди (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