stringtranslate.com

Класс (компьютерное программирование)

В объектно-ориентированном программировании класс — это расширяемый шаблон программного кода для создания объектов , предоставляющий начальные значения состояния ( переменные-члены ) и реализации поведения (функции-члены или методы ) . [1] [2] [а]

Когда объект создается конструктором класса, результирующий объект называется экземпляром класса , а переменные-члены, специфичные для объекта, называются переменными экземпляра , в отличие от переменных класса, общих для всего класса.

В некоторых языках классы, по сути, являются лишь функцией времени компиляции (новые классы не могут быть объявлены во время выполнения ), в то время как в других языках классы являются первоклассными гражданами и обычно сами являются объектами (обычно типа Класс или что-то подобное). В этих языках класс, создающий классы внутри себя, называется метаклассом .

Связанные понятия

Пример

В объектно-ориентированном программировании (ООП) экземпляр — это конкретное появление любого объекта , обычно существующего во время выполнения компьютерной программы. Формально «экземпляр» является синонимом «объекта», поскольку каждый из них представляет собой определенное значение (реализацию), и их можно назвать экземплярным объектом; «экземпляр» подчеркивает отчетливую идентичность объекта. Создание экземпляра называется созданием экземпляра.

Объект может быть изменен по-разному. Каждая реализованная вариация этого объекта является экземпляром своего класса. То есть это член данного класса, который имеет указанные значения , а не переменные . В контексте, не связанном с программированием, вы можете думать о «собаке» как о типе, а о вашей конкретной собаке как об экземпляре этого класса. [3]

В программировании на основе классов объекты создаются как экземпляры классов с помощью подпрограмм , называемых конструкторами , и уничтожаются деструкторами . Объект является экземпляром класса, поскольку он может получить доступ ко всем типам данных (примитивным и не примитивным), методам и т. д. класса. Следовательно, объекты можно называть экземплярами класса или объектами класса. Создание экземпляра объекта называется конструкцией. Не все классы могут быть созданы — абстрактные классы не могут быть созданы, а классы, экземпляры которых могут быть созданы, называются конкретными классами . В программировании на основе прототипов создание экземпляра вместо этого выполняется путем копирования (клонирования) экземпляра прототипа. [4]

Класс против типа

В самом обычном использовании люди часто ссылаются на «класс» объекта, но, узко говоря, объекты имеют тип : интерфейс, а именно типы переменных-членов, сигнатуры функций-членов (методов) и свойств, которым они удовлетворяют. В то же время класс имеет реализацию (точнее реализацию методов) и может создавать объекты заданного типа с заданной реализацией. [5] С точки зрения теории типов, класс — это реализация — « конкретная структура данных и набор подпрограмм», — «а тип — это интерфейс ». Разные (конкретные) классы могут создавать объекты одного и того же (абстрактного) типа (в зависимости от системы типов); например, тип Stack можно реализовать с помощью двух классов — SmallStack (быстро для небольших стеков, но плохо масштабируется) и ScalableStack (хорошо масштабируется, но требует больших затрат для небольших стеков). Аналогично, данный класс может иметь несколько разных конструкторов.

Типы классов обычно представляют существительные, такие как человек, место или предмет, или что-то номинальное , а класс представляет собой их реализацию. Например, тип Banana может представлять свойства и функциональность бананов в целом, тогда как классы ABCBanana и XYZBanana будут представлять способы производства бананов (скажем, поставщиков бананов или структуры и функции данных для представления и рисования бананов в видеоиграх). Класс ABCBanana затем сможет создавать определенные бананы: экземпляры класса ABCBanana будут объектами типа Banana . Часто дается только одна реализация типа, и в этом случае имя класса часто совпадает с именем типа.

Проектирование и реализация

Занятия состоят из структурных и поведенческих компонентов. [1] Языки программирования, включающие классы в качестве программной конструкции, обеспечивают поддержку различных функций, связанных с классами, а синтаксис, необходимый для использования этих функций, сильно варьируется от одного языка программирования к другому.

Состав

UML- нотация для классов

Класс содержит описания полей данных (или свойств , полей , членов данных или атрибутов ). Обычно это типы и имена полей, которые будут связаны с переменными состояния во время выполнения программы; эти переменные состояния принадлежат либо классу, либо конкретным экземплярам класса. В большинстве языков структура, определенная классом, определяет расположение памяти, используемой его экземплярами. Возможны и другие реализации: например, объекты в Python используют ассоциативные контейнеры «ключ-значение». [6]

Некоторые языки программирования, такие как Eiffel, поддерживают спецификацию инвариантов как часть определения класса и реализуют их через систему типов. Инкапсуляция состояния необходима для обеспечения соблюдения инвариантов класса.

Поведение

Поведение класса или его экземпляров определяется с помощью методов . Методы — это подпрограммы , способные работать с объектами или классами. Эти операции могут изменить состояние объекта или просто предоставить способы доступа к нему. [7] Существует множество видов методов, но их поддержка различается в зависимости от языка. Некоторые типы методов создаются и вызываются программным кодом, тогда как другие специальные методы, такие как конструкторы, деструкторы и операторы преобразования, создаются и вызываются кодом, сгенерированным компилятором. Язык также может позволять программисту определять и вызывать эти специальные методы. [8] [9]

Интерфейс класса

Каждый класс реализует (или реализует ) интерфейс, предоставляя структуру и поведение. Структура состоит из данных и состояния, а поведение состоит из кода, определяющего реализацию методов. [10] Существует различие между определением интерфейса и реализацией этого интерфейса; однако во многих языках программирования эта грань размыта, поскольку объявления классов одновременно определяют и реализуют интерфейс. Однако некоторые языки предоставляют функции, разделяющие интерфейс и реализацию. Например, абстрактный класс может определять интерфейс без предоставления реализации.

Языки, поддерживающие наследование классов, также позволяют классам наследовать интерфейсы от классов, от которых они произошли.

Например, если «класс A» наследуется от «класса B» и если «класс B» реализует интерфейс «интерфейс B», то «класс A» также наследует функциональность (объявление констант и методов), предоставляемую «интерфейсом B».

В языках, поддерживающих спецификаторы доступа, интерфейс класса считается набором открытых членов класса, включая как методы, так и атрибуты (посредством неявных методов получения и установки ); любые частные члены или внутренние структуры данных не предназначены для зависимости от внешнего кода и, следовательно, не являются частью интерфейса.

Методология объектно-ориентированного программирования требует, чтобы операции любого интерфейса класса были независимы друг от друга. В результате получается многоуровневая конструкция, в которой клиенты интерфейса используют методы, объявленные в интерфейсе. Интерфейс не предъявляет клиентам требований к вызову операций одного интерфейса в каком-либо определенном порядке. Преимущество этого подхода состоит в том, что клиентский код может предполагать, что операции интерфейса доступны для использования всякий раз, когда клиент имеет доступ к объекту. [11] [ нужна ссылка ]

Пример интерфейса класса

Кнопки на передней панели телевизора — это интерфейс между вами и электропроводкой на другой стороне пластикового корпуса. Вы нажимаете кнопку «питание», чтобы включать и выключать телевизор. В этом примере экземпляром является ваш конкретный телевизор, каждый метод представлен кнопкой, а все кнопки вместе составляют интерфейс (другие телевизоры той же модели, что и ваш, будут иметь тот же интерфейс). В своей наиболее распространенной форме интерфейс представляет собой спецификацию группы связанных методов без какой-либо связанной реализации этих методов.

Телевизор также имеет множество атрибутов , таких как размер и поддержка цвета, которые вместе составляют его структуру. Класс представляет собой полное описание телевизора, включая его атрибуты (структуру) и кнопки (интерфейс).

Получение общего количества выпущенных телевизоров может быть статическим методом класса телевизоров. Этот метод связан с классом, но находится за пределами домена каждого экземпляра класса. Другим примером является статический метод, который находит конкретный экземпляр из множества всех телевизионных объектов.

Доступность для участников

Ниже приведен общий набор спецификаторов доступа : [12]

Хотя многие объектно-ориентированные языки поддерживают указанные выше спецификаторы доступа, их семантика может отличаться.

Объектно-ориентированное проектирование использует спецификаторы доступа в сочетании с тщательным проектированием реализаций общедоступных методов для обеспечения соблюдения инвариантов классов — ограничений на состояние объектов. Спецификаторы доступа обычно используются для отделения внутренних данных класса от его интерфейса: внутренняя структура становится частной, а общедоступные методы доступа могут использоваться для проверки или изменения таких частных данных.

Спецификаторы доступа не обязательно контролируют видимость , поскольку даже частные члены могут быть видны внешнему коду клиента. В некоторых языках на недоступный, но видимый член можно ссылаться во время выполнения (например, с помощью указателя, возвращаемого функцией-членом), но попытка использовать его путем ссылки на имя члена из клиентского кода приведет к быть предотвращено средством проверки типов. [13]

Различные объектно-ориентированные языки программирования обеспечивают доступность и видимость членов в разной степени и, в зависимости от системы типов языка и политики компиляции, реализуются либо во время компиляции , либо во время выполнения . Например, язык Java не позволяет компилировать клиентский код, который обращается к частным данным класса. [14] В языке C++ частные методы видны, но недоступны в интерфейсе; однако их можно сделать невидимыми, явно объявив полностью абстрактные классы, которые представляют интерфейсы класса. [15]

В некоторых языках предусмотрены другие схемы доступности:

Межклассовые отношения

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

Композиционный

Классы могут состоять из других классов, тем самым устанавливая композиционные отношения между включающим классом и его встроенными классами. Композиционные отношения между классами также широко известны как отношения «имеет» . [18] Например, класс «Автомобиль» может состоять из класса «Двигатель» и содержать его. Следовательно, у автомобиля есть двигатель. Одним из аспектов композиции является включение, то есть включение экземпляров компонента в экземпляр, который их содержит. Если включающий объект содержит экземпляры компонентов по значению, компоненты и их включающий объект имеют одинаковое время жизни . Если компоненты содержатся посредством ссылки, они могут иметь разный срок службы. [19] Например, в Objective-C 2.0:

@interface  Автомобиль  : NSObject@property NSString * имя ; @property Engine * двигатель @property NSArray * шины ;      @конец

Этот класс Car имеет экземпляр NSString ( строковый объект), Engine и 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 в качестве суперкласса Rectangle и Ellipse , а Square будет подклассом Rectangle . Все это отношения подмножеств и в теории множеств, т. е. все квадраты являются прямоугольниками, но не все прямоугольники являются квадратами.

Распространенной концептуальной ошибкой является ошибочное принятие части отношения за подкласс. Например, легковой и грузовой автомобили являются видами транспортных средств, и было бы целесообразно смоделировать их как подклассы класса транспортных средств. Однако было бы ошибкой моделировать части автомобиля как отношения подклассов. Например, автомобиль состоит из двигателя и кузова, но было бы нецелесообразно моделировать двигатель или кузов как подкласс автомобиля.

В объектно-ориентированном моделировании такие отношения обычно моделируются как свойства объекта. В этом примере класс Car будет иметь свойство parts . части будут типизированы для хранения коллекции объектов, таких как экземпляры Body , Engine , Tires и т. д. Языки моделирования объектов, такие как 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в C#, так и finalв Java или PHP. [40] [41] [42] Например, Stringкласс Java обозначается как Final . [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]

Представление во время выполнения

Класс как тип данных обычно рассматривается как конструкция времени компиляции. [53] Язык или библиотека могут также поддерживать метаобъекты прототипа или фабрики , которые представляют информацию о классах во время выполнения или даже представляют метаданные, которые обеспечивают доступ к средствам отражения и возможность манипулировать форматами структур данных во время выполнения. Многие языки отличают этот вид информации о типах во время выполнения от класса на том основании, что эта информация не требуется во время выполнения. Некоторые динамические языки не проводят строгих различий между конструкциями времени выполнения и времени компиляции и, следовательно, могут не различать метаобъекты и классы.

Например, если Human является метаобъектом , представляющим класс Person, то экземпляры класса Person могут быть созданы с использованием возможностей метаобъекта Human .

Смотрите также

Примечания

  1. ^ Во многих языках имя класса используется как имя класса (сам шаблон), имя конструктора класса по умолчанию ( подпрограмма , создающая объекты) и как тип объектов, генерируемых путем создания экземпляра класса. ; эти различные понятия легко объединить. [2] Хотя, вплоть до смешения, можно утверждать, что это особенность, присущая языку из-за его полиморфной природы и того, почему эти языки настолько мощны, динамичны и адаптируемы для использования по сравнению с языками без полиморфизма. Таким образом, им легче моделировать динамические системы (т. е. реальный мир, машинное обучение, искусственный интеллект).
  1. ^ аб Гамма и др. 1995, с. 14.
  2. ^ ab Брюс 2002, 2.1 Объекты, классы и типы объектов, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18.
  3. ^ «Что такое экземпляр? - Определение с WhatIs.com» . Whatis.techtarget.com . Проверено 9 февраля 2014 г.
  4. Амир, Масрур (25 марта 2023 г.). «ООП — Объектно-ориентированное программирование — Концепции | Языки | Преимущества [2023]». Бот Geeks | Сайт компьютерных наук для компьютерных фанатов . Проверено 4 апреля 2023 г.
  5. ^ Гамма и др. 1995, с. 17.
  6. ^ ab «3. Модель данных». Справочник по языку Python . Фонд программного обеспечения Python . Проверено 26 апреля 2012 г.
  7. ^ Буч 1994, с. 86-88.
  8. ^ "Классы (I)" . Учебник по языку С++ . cplusplus.com . Проверено 29 апреля 2012 г.
  9. ^ «Классы (II)» . Учебник по языку С++ . cplusplus.com . Проверено 29 апреля 2012 г.
  10. ^ Буч 1994, с. 105.
  11. ^ Джамрич, Парсонс, июнь (22 июня 2015 г.). Новые перспективы компьютерных концепций, 2016. Комплексное . Бостон, Массачусетс. ISBN 9781305271616. ОКЛК  917155105.{{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка ) CS1 maint: несколько имен: список авторов ( ссылка )
  12. ^ ab «Контроль доступа к членам класса». Учебники по Java . Оракул . Проверено 19 апреля 2012 г.
  13. ^ «OOP08-CPP. Не возвращать ссылки на частные данные» . CERT Стандарт безопасного кодирования C++ . Университет Карнеги Меллон. 10 мая 2010 г. Архивировано из оригинала 3 октября 2015 г. Проверено 7 мая 2012 г.
  14. ^ Бен-Ари, Мордехай (24 января 2007 г.). «2.2 Идентификаторы» (PDF) . Ошибки компиляции и выполнения в Java . Архивировано (PDF) из оригинала 18 октября 2011 г. Проверено 7 мая 2012 г.
  15. ^ ab Wild, Фред. «Интерфейсы C++». Доктор Добб . УБМ Техвеб . Проверено 2 мая 2012 г.
  16. ^ Томас; Хант. «Классы, объекты и переменные». Программирование на Ruby: Руководство прагматичного программиста . Руби-Док.org . Проверено 26 апреля 2012 г.
  17. ^ «Дружба и наследство». Учебник по языку С++ . cplusplus.com . Проверено 26 апреля 2012 г.
  18. ^ Буч 1994, с. 180.
  19. ^ Буч 1994, с. 128-129.
  20. ^ Буч 1994, с. 112.
  21. ^ ab «Интерфейсы». Учебники по Java . Оракул . Проверено 1 мая 2012 г.
  22. Берфельд, Мария (2 декабря 2008 г.). «Преобразование UML в Java в выпусках IBM Rational Software Architect и сопутствующем программном обеспечении». ИБМ . Проверено 20 декабря 2013 г.
  23. ^ Якобсен, Ивар; Магнус Кристерсон; Патрик Йонссон; Гуннар Овергаард (1992). Объектно-ориентированная разработка программного обеспечения. Аддисон-Уэсли ACM Press. стр. 43–69. ISBN 0-201-54435-0.
  24. ^ Кнублаух, Хольгер; Оберле, Дэниел; Тетлоу, Фил; Уоллес, Эван (9 марта 2006 г.). «Учебник по семантической сети для разработчиков объектно-ориентированного программного обеспечения». W3C . Проверено 30 июля 2008 г.
  25. ^ Аб Белл, Дональд. «Основы UML: диаграмма классов». разработчик работает . ИБМ . Проверено 2 мая 2012 г.
  26. ^ Буч 1994, с. 179.
  27. ^ ab «Полиморфизм». Учебник по языку С++ . cplusplus.com . Проверено 2 мая 2012 г.
  28. ^ «Абстрактные методы и классы». Учебники по Java . Оракул . Проверено 2 мая 2012 г.
  29. ^ «Абстракция классов». Руководство по PHP . Группа PHP . Проверено 2 мая 2012 г.
  30. ^ «Интерфейсы (Руководство по программированию на C#)» . Руководство по программированию на C# . Майкрософт . Проверено 15 августа 2013 г.
  31. ^ «Наследование (Руководство по программированию на C#)» . Руководство по программированию на C# . Майкрософт . Проверено 2 мая 2012 г.
  32. ^ «Вложенные классы (только C++)». XL C/C++ V8.0 для AIX . ИБМ . Проверено 7 мая 2012 г.
  33. ^ «Имена локальных типов (только C++)» . XL C/C++ V8.0 для AIX . ИБМ . Проверено 7 мая 2012 г.
  34. ^ «Локальные классы (только C++)». XL C/C++ V8.0 для AIX . ИБМ . Проверено 7 мая 2012 г.
  35. ^ Буч 1994, с. 133-134.
  36. ^ «13 классов и метаклассов». pharo.gforge.inria.fr . Архивировано из оригинала 24 февраля 2021 г. Проверено 31 октября 2016 г.
  37. ^ Томас; Хант. «Классы и объекты». Программирование на Ruby: Руководство прагматичного программиста . Руби-Док.org . Проверено 8 мая 2012 г.
  38. ^ Буч 1994, с. 134.
  39. ^ «СС: Концепции». Протокол метаобъектов Common Lisp Object System . Ассоциация пользователей Лиспа. Архивировано из оригинала 15 ноября 2010 г. Проверено 8 мая 2012 г.
  40. ^ «Запечатано (Справочник по C#)». Справочник по С# . Майкрософт . Проверено 8 мая 2012 г.
  41. ^ «Написание окончательных классов и методов». Учебники по Java . Оракул . Проверено 8 мая 2012 г.
  42. ^ «PHP: последнее ключевое слово» . Руководство по PHP . Группа PHP . Проверено 21 августа 2014 г.
  43. ^ «Строка (платформа Java SE 7)» . Платформа Java, стандартная версия 7: Спецификация API . Оракул . Проверено 8 мая 2012 г.
  44. Брэнд, Сай (2 марта 2020 г.). «Преимущества выпускных занятий». Блог команды Microsoft C++ . Майкрософт . Проверено 4 апреля 2020 г.
  45. ^ "9. Занятия". Учебник по Python . Python.org . Проверено 3 марта 2018 г. Как и в случае с модулями, классы имеют динамическую природу Python: они создаются во время выполнения и могут быть изменены после создания.
  46. ^ аб Майро; БиллВагнер; tompratt-AQ (19 сентября 2015 г.), «Частичные классы и методы», Руководство по программированию на C# , Microsoft , получено 8 августа 2018 г.
  47. ^ «Статические классы и члены статических классов (Руководство по программированию на C#)» . Руководство по программированию на C# . Майкрософт . Проверено 8 мая 2012 г.
  48. ^ «Анонимные классы (Учебные пособия по Java™> Изучение языка Java> Классы и объекты)» . docs.oracle.com . Проверено 13 мая 2021 г.
  49. ^ «PHP: Анонимные классы — Руководство» . www.php.net . Проверено 11 августа 2021 г.
  50. ^ «Что такое объект?». oracle.com . Корпорация Оракл . Проверено 13 декабря 2013 г.
  51. ^ Буч, Грейди; Роберт А. Максимчук; Майкл В. Энгл; Бобби Дж. Янг, доктор философии; Джим Коналлен; Келли А. Хьюстон (30 апреля 2007 г.). Объектно-ориентированный анализ и проектирование с приложениями. Аддисон-Уэсли Профессионал. стр. 1–28. ISBN 978-0-201-89551-3. Проверено 20 декабря 2013 г. Существуют фундаментальные ограничивающие факторы человеческого познания; мы можем устранить эти ограничения с помощью декомпозиции, абстракции и иерархии.
  52. ^ Якобсен, Ивар; Магнус Кристерсон; Патрик Йонссон; Гуннар Овергаард (1992). Объектно-ориентированная разработка программного обеспечения. Аддисон-Уэсли ACM Press. ISBN 0-201-54435-0.
  53. ^ «Международный стандарт C++» (PDF) . Рабочий проект стандарта языка программирования C++ . ISO/IEC JTC1/SC22 WG21. Архивировано (PDF) из оригинала 9 декабря 2017 г. Проверено 5 января 2020 г.

Рекомендации

дальнейшее чтение