stringtranslate.com

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

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

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

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

Атрибуты

Жизненный цикл объекта

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

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

Тип

Объект выражает тип данных как интерфейс — тип каждой переменной-члена и сигнатуру каждой функции-члена (метода). Класс определяет реализацию интерфейса, а создание экземпляра класса приводит к созданию объекта, который раскрывает реализацию через интерфейс. [3] В терминах теории типов класс — это реализация — конкретная структура данных и набор подпрограмм — тогда как тип — это интерфейс . Различные (конкретные) классы могут создавать объекты одного и того же (абстрактного) типа (в зависимости от системы типов). Например, тип (интерфейс) Stack может быть реализован SmallStack , который быстр для небольших стеков, но плохо масштабируется, и ScalableStack , который хорошо масштабируется, но имеет высокие накладные расходы для небольших стеков.

Структура

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

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

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

Поведение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наследование

Концептуально суперкласс — это супермножество своих подклассов. Например, GraphicObject может быть суперклассом Rectangle и Ellipse , тогда как Square будет подклассом Rectangle . Все это также отношения подмножеств в теории множеств, то есть все квадраты являются прямоугольниками, но не все прямоугольники являются квадратами.

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

В объектно-ориентированном моделировании эти виды отношений обычно моделируются как свойства объектов. В этом примере класс Car будет иметь свойство, называемое parts . parts будет типизировано для хранения коллекции объектов, таких как экземпляры Body , Engine , Tires и т. д. Языки объектного моделирования, такие как UML, включают возможности моделирования различных аспектов «части» и других видов отношений – данных, таких как мощность объектов, ограничения на входные и выходные значения и т. д. Эта информация может использоваться инструментами разработчика для генерации дополнительного кода помимо основных определений данных для объектов, таких как проверка ошибок в методах get и set . [16]

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

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

Однако объекты семантических веб- приложений имеют несколько суперклассов. Нестабильность Интернета требует такого уровня гибкости, и технологические стандарты, такие как Web Ontology Language (OWL), предназначены для его поддержки.

Аналогичная проблема заключается в том, можно ли изменять иерархию классов во время выполнения. Такие языки, как Flavors, CLOS и Smalltalk, поддерживают эту функцию как часть своих метаобъектных протоколов . Поскольку классы сами по себе являются объектами первого класса, можно заставить их динамически изменять свою структуру, отправляя им соответствующие сообщения. Другие языки, которые больше фокусируются на строгой типизации, такие как Java и C++, не позволяют изменять иерархию классов во время выполнения. Объекты семантической сети имеют возможность изменять классы во время выполнения. Обоснование аналогично обоснованию разрешения множественных суперклассов, что Интернет настолько динамичен и гибок, что для управления этой изменчивостью требуются динамические изменения иерархии. [18]

Хотя многие языки на основе классов поддерживают наследование, наследование не является неотъемлемым аспектом классов. Язык на основе объектов (т. е. классический Visual Basic ) поддерживает классы, но не поддерживает наследование.

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

Язык программирования может поддерживать различные функции взаимоотношений классов.

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

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

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

Этот класс Car имеет экземпляр NSString ( объект строки ), Engine и NSArray (объект массива).

Иерархический

Классы могут быть получены из одного или нескольких существующих классов, тем самым устанавливая иерархические отношения между производными классами ( базовыми классами , родительскими классами илисуперклассы ) и производный класс (дочерний классилиподкласс). Связь производного класса с производными от классов обычно известна как связь is-a .[21]Например, класс «Button» может быть получен из класса «Control». Следовательно, Buttonявляется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]

Класс, состоящий только из чистых виртуальных методов, называется чистым абстрактным базовым классом (или чистым ABC ) в C++ и также известен пользователям языка как интерфейс . [13] Другие языки, в частности Java и C#, поддерживают вариант абстрактных классов, называемый интерфейсом, через ключевое слово в языке. В этих языках множественное наследование не допускается, но класс может реализовывать несколько интерфейсов. Такой класс может содержать только абстрактные общедоступные методы. [22] [28] [29]

Местный и внутренний

В некоторых языках классы могут быть объявлены в областях, отличных от глобальной. Существуют различные типы таких классов.

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

Локальный класс — это класс, определенный внутри процедуры или функции. Такая структура ограничивает ссылки на имя класса в пределах области, где объявлен класс. В зависимости от семантических правил языка, могут быть дополнительные ограничения на локальные классы по сравнению с нелокальными. Одним из распространенных ограничений является запрет на доступ методов локального класса к локальным переменным охватывающей функции. Например, в C++ локальный класс может ссылаться на статические переменные, объявленные внутри его охватывающей функции, но не может обращаться к автоматическим переменным функции . [32]

Метакласс

Метакласс — это класс, где экземпляры — это классы. [33] Метакласс описывает общую структуру коллекции классов и может реализовывать шаблон проектирования или описывать определенные виды классов. Метаклассы часто используются для описания фреймворков . [34]

В некоторых языках, таких как Python , Ruby или Smalltalk , класс также является объектом; таким образом, каждый класс является экземпляром уникального метакласса, встроенного в язык. [4] [35] [36] Common Lisp Object System (CLOS) предоставляет протоколы метаобъектов (MOP) для реализации этих классов и метаклассов. [37]

Запечатанный

Запечатанный класс не может быть подклассифицирован. По сути, это противоположность абстрактному классу, который должен быть получен для использования. Запечатанный класс неявно конкретен .

Класс, объявленный как запечатанный с помощью ключевого слова sealedв C#, finalJava или PHP. [38] [39] [40]

Например, Stringкласс Java помечен как final . [41]

Запечатанные классы могут позволить компилятору выполнять оптимизации, которые недоступны для классов, которые могут быть подклассифицированы. [42]

Открыть

Открытый класс может быть изменен. Обычно исполняемая программа не может быть изменена клиентами. Разработчики часто могут изменять некоторые классы, но обычно не могут изменять стандартные или встроенные. В Ruby все классы открыты. В Python классы могут быть созданы во время выполнения, и все они могут быть изменены впоследствии. [43] Категории Objective-C позволяют программисту добавлять методы в существующий класс без необходимости перекомпилировать этот класс или даже иметь доступ к его исходному коду.

Миксин

В некоторых языках есть специальная поддержка для mixins , хотя в любом языке с множественным наследованием mixin — это просто класс, который не представляет отношения is-a-type-of. Mixins обычно используются для добавления одних и тех же методов в несколько классов; например, класс UnicodeConversionMixin может предоставлять метод с именем unicode_to_ascii при включении в классы FileReader и WebPageScraper , которые не имеют общего родителя.

Частичный

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

Основной мотивацией для введения частичных классов является облегчение реализации генераторов кода , таких как визуальные дизайнеры . [44] В противном случае это вызов или компромисс для разработки генераторов кода, которые могут управлять сгенерированным кодом, когда он чередуется с кодом, написанным разработчиком. Используя частичные классы, генератор кода может обрабатывать отдельный файл или крупнозернистый частичный класс внутри файла и, таким образом, освобождается от сложного вставки сгенерированного кода с помощью обширного синтаксического анализа, увеличивая эффективность компилятора и устраняя потенциальный риск повреждения кода разработчика. В простой реализации частичных классов компилятор может выполнить фазу предварительной компиляции , где он «объединяет» все части частичного класса. Затем компиляция может продолжаться как обычно.

Другие преимущества и эффекты функции частичного класса включают в себя:

Частичные классы существовали в Smalltalk под названием Class Extensions в течение значительного времени. С появлением .NET Framework 2 компания Microsoft представила частичные классы, поддерживаемые как в C# 2.0, так и в Visual Basic 2005. WinRT также поддерживает частичные классы.

Не поддающийся инстанцированию

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

Например, в C# класс, помеченный как «статический», не может быть инстанцирован, может иметь только статические члены (поля, методы и т. д.), не может иметь конструкторов экземпляров и является запечатанным . [45]

Безымянный

Неименованный класс или анонимный класс не привязан к имени или идентификатору при определении. [46] [47] Это аналогично именованным и неименованным функциям .

Преимущества

Преимущества организации программного обеспечения в классы объектов делятся на три категории: [48]

Классы объектов способствуют быстрой разработке, поскольку они уменьшают семантический разрыв между кодом и пользователями. Системные аналитики могут общаться как с разработчиками, так и с пользователями, используя по сути один и тот же словарь, говоря о счетах, клиентах, счетах и ​​т. д. Классы объектов часто способствуют быстрой разработке, поскольку большинство объектно-ориентированных сред поставляются с мощными инструментами отладки и тестирования. Экземпляры классов можно проверять во время выполнения, чтобы убедиться, что система работает так, как ожидалось. Кроме того, вместо того, чтобы получать дампы основной памяти, большинство объектно-ориентированных сред интерпретируют возможности отладки, так что разработчик может точно проанализировать, где в программе произошла ошибка, и может увидеть, какие методы были вызваны, к каким аргументам и с какими аргументами. [49]

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

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

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

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

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

Программирование на основе прототипов

В отличие от создания объекта из класса, некоторые контексты программирования поддерживают создание объекта путем копирования (клонирования) объекта -прототипа . [52]

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

Примечания

  1. ^ Гамма и др. 1995, стр. 14.
  2. ^ Брюс 2002, 2.1 Объекты, классы и типы объектов, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18.
  3. ^ Гамма и др. 1995, стр. 17.
  4. ^ ab "3. Модель данных". Справочник по языку Python . Python Software Foundation . Получено 2012-04-26 .
  5. ^ Буч 1994, стр. 86-88.
  6. ^ "Классы (I)". Учебник языка C++ . cplusplus.com . Получено 29.04.2012 .
  7. ^ "Классы (II)". Учебник языка C++ . cplusplus.com . Получено 29.04.2012 .
  8. ^ Буч 1994, стр. 105.
  9. ^ Парсонс, Джун Джамрич (2015-06-22). Новые перспективы компьютерных концепций 2016, всеобъемлющий . Бостон, Массачусетс: Cengage Learning. ISBN 9781305271616. OCLC  917155105.
  10. ^ ab "Управление доступом к членам класса". Учебники Java . Oracle . Получено 2012-04-19 .
  11. ^ "OOP08-CPP. Не возвращайте ссылки на приватные данные". CERT C++ Secure Coding Standard . Carnegie Mellon University. 2010-05-10. Архивировано из оригинала 2015-10-03 . Получено 2012-05-07 .
  12. ^ Бен-Ари, Мордехай (2007-01-24). "2.2 Идентификаторы" (PDF) . Ошибки компиляции и выполнения в Java . Архивировано (PDF) из оригинала 2011-10-18 . Получено 2012-05-07 .
  13. ^ ab Wild, Fred. "C++ Interfaces". Dr. Dobb's . UBM Techweb . Получено 2012-05-02 .
  14. ^ Томас; Хант. "Классы, объекты и переменные". Программирование на Ruby: Руководство прагматичного программиста . Ruby-Doc.org . Получено 26.04.2012 .
  15. ^ "Дружба и наследование". Учебник языка C++ . cplusplus.com . Получено 2012-04-26 .
  16. ^ Берфельд, Мария (2 декабря 2008 г.). «Преобразование UML-в-Java в редакциях IBM Rational Software Architect и связанном программном обеспечении». IBM . Получено 20 декабря 2013 г. .
  17. ^ Якобсен, Ивар; Магнус Кристерсон; Патрик Йонссон; Гуннар Овергаард (1992). Объектно-ориентированная разработка программного обеспечения. Аддисон-Уэсли ACM Press. стр. 43–69. ISBN 0-201-54435-0.
  18. ^ Кнублаух, Хольгер; Оберле, Дэниел; Тетлоу, Фил; Уоллес, Эван (2006-03-09). «Учебник семантической паутины для разработчиков объектно-ориентированного программного обеспечения». W3C . Получено 2008-07-30 .
  19. ^ Буч 1994, стр. 180.
  20. ^ Буч 1994, стр. 128-129.
  21. ^ Буч 1994, стр. 112.
  22. ^ ab "Интерфейсы". Учебники Java . Oracle . Получено 01.05.2012 .
  23. ^ ab Белл, Дональд. "Основы UML: Диаграмма классов". Developer Works . IBM . Получено 2012-05-02 .
  24. ^ Буч 1994, стр. 179.
  25. ^ ab "Полиморфизм". Учебник языка C++ . cplusplus.com . Получено 2012-05-02 .
  26. ^ "Абстрактные методы и классы". Учебники Java . Oracle . Получено 2012-05-02 .
  27. ^ "Абстракция классов". PHP Manual . PHP Group . Получено 2012-05-02 .
  28. ^ "Интерфейсы (Руководство по программированию на C#)". Руководство по программированию на C# . Microsoft . Получено 2013-08-15 .
  29. ^ "Наследование (Руководство по программированию на C#)". Руководство по программированию на C# . Microsoft . Получено 2012-05-02 .
  30. ^ "Вложенные классы (только C++)". XL C/C++ V8.0 для AIX . IBM . Получено 2012-05-07 .
  31. ^ "Имена локальных типов (только C++)". XL C/C++ V8.0 для AIX . IBM . Получено 2012-05-07 .
  32. ^ "Локальные классы (только C++)". XL C/C++ V8.0 для AIX . IBM . Получено 2012-05-07 .
  33. ^ Буч 1994, стр. 133-134.
  34. ^ "13 Классы и метаклассы". pharo.gforge.inria.fr . Архивировано из оригинала 2021-02-24 . Получено 2016-10-31 .
  35. ^ Томас; Хант. "Классы и объекты". Программирование на Ruby: Руководство прагматичного программиста . Ruby-Doc.org . Получено 08.05.2012 .
  36. Буч 1994, стр. 134.
  37. ^ "MOP: Концепции". The Common Lisp Object System MetaObject Protocol . Ассоциация пользователей Lisp. Архивировано из оригинала 2010-11-15 . Получено 2012-05-08 .
  38. ^ "sealed (Справочник C#)". Справочник C# . Microsoft . Получено 2012-05-08 .
  39. ^ "Написание финальных классов и методов". Учебники Java . Oracle . Получено 2012-05-08 .
  40. ^ "PHP: Final Keyword". PHP Manual . PHP Group . Получено 2014-08-21 .
  41. ^ "String (Java Platform SE 7)". Java Platform, Standard Edition 7: API Specification . Oracle . Получено 2012-05-08 .
  42. ^ Brand, Sy (2 марта 2020 г.). «Преимущества производительности финальных классов». Блог команды Microsoft C++ . Microsoft . Получено 4 апреля 2020 г.
  43. ^ "9. Классы". Учебник Python . Python.org . Получено 3 марта 2018 г. Как и модули, классы разделяют динамическую природу Python: они создаются во время выполнения и могут быть изменены после создания.
  44. ^ ab mairaw; BillWagner; tompratt-AQ (2015-09-19), "Partial Classes and Methods", C# Programming Guide , Microsoft , получено 2018-08-08
  45. ^ "Статические классы и статические члены классов (Руководство по программированию на C#)". Руководство по программированию на C# . Microsoft . Получено 2012-05-08 .
  46. ^ "Анонимные классы (Учебники Java > Изучение языка Java > Классы и объекты)". docs.oracle.com . Получено 13.05.2021 .
  47. ^ "PHP: Анонимные классы - Руководство". www.php.net . Получено 2021-08-11 .
  48. ^ "Что такое объект?". oracle.com . Oracle Corporation . Получено 13 декабря 2013 г. .
  49. ^ Буч, Грейди; Роберт А. Максимчук; Майкл В. Энгл; Бобби Дж. Янг, доктор философии; Джим Коналлен; Келли А. Хьюстон (30 апреля 2007 г.). Объектно-ориентированный анализ и проектирование с приложениями. Addison-Wesley Professional. стр. 1–28. ISBN 978-0-201-89551-3. Получено 20 декабря 2013 г. . Существуют фундаментальные ограничивающие факторы человеческого познания; мы можем устранить эти ограничения с помощью декомпозиции, абстракции и иерархии.
  50. ^ Якобсен, Ивар; Магнус Кристерсон; Патрик Йонссон; Гуннар Овергаард (1992). Объектно-ориентированная разработка программного обеспечения. Аддисон-Уэсли ACM Press. ISBN 0-201-54435-0.
  51. ^ "C++ International standard" (PDF) . Рабочий проект, Стандарт языка программирования C++ . ISO/IEC JTC1/SC22 WG21. Архивировано (PDF) из оригинала 2017-12-09 . Получено 5 января 2020 .
  52. ^ Амир, Масрур (25 марта 2023 г.). "ООП - Объектно-ориентированное программирование - Концепции | Языки | Преимущества [2023]". The Geeks Bot | Сайт по информатике для гиков . Получено 04.04.2023 .

Ссылки

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