Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

Класс против типа [ править ]

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

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

Дизайн и реализация [ править ]

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

Структура [ править ]

Обозначение UML для классов

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

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

Поведение [ править ]

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

Концепция интерфейса класса [ править ]

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

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

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

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

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

Пример [ править ]

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

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

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

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

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

  • Private (или class-private ) ограничивает доступ к самому классу. Только методы, которые являются частью того же класса, могут получить доступ к закрытым членам.
  • Защищенный (или защищенный классом ) позволяет самому классу и всем его подклассам получить доступ к члену.
  • Открытый означает, что любой код может получить доступ к члену по его имени.

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

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

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

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

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

  • Доступность экземпляра и класса : Ruby поддерживает спецификаторы доступа для частных и защищенных экземпляров вместо классов-частных и защищенных классов, соответственно. Они отличаются тем, что ограничивают доступ на основе самого экземпляра, а не класса экземпляра. [15]
  • Friend : C ++ поддерживает механизм, при котором функция, явно объявленная как дружественная функция класса, может обращаться к членам, обозначенным как частные или защищенные. [16]
  • На основе пути : Java поддерживает ограничение доступа к члену в пакете Java , который является логическим путем к файлу. Однако распространенной практикой при расширении инфраструктуры Java является реализация классов в том же пакете, что и класс инфраструктуры, для доступа к защищенным членам. Исходный файл может существовать в совершенно другом месте и может быть развернут в другом файле .jar, но по-прежнему находится на том же логическом пути в отношении JVM. [11]

Межклассовые отношения [ править ]

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

Композиционный [ править ]

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

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

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

Иерархический [ править ]

Классы могут быть производными от одного или нескольких существующих классов, тем самым устанавливая иерархические отношения между производными классами ( базовыми классами , родительскими классами илисуперклассы ) и производный класс ( дочерний класс или подкласс ). Отношение производного класса к производному от классов обычно известный как есть- отношения. [19] Например, класс «Button» может быть производным от класса «Control». Следовательно, кнопка - это элемент управления. Структурные и поведенческие члены родительских классов наследуются дочерним классом. Производные классы могут определять дополнительные структурные члены (поля данных) и поведенческие члены (методы) в дополнение к тем, которые они наследуют и, следовательно, являются специализациями своих суперклассов. Кроме того, производные классы могут переопределять унаследованные методы, если язык позволяет.

Не все языки поддерживают множественное наследование. Например, Java позволяет классу реализовывать несколько интерфейсов, но наследовать только от одного класса. [20] Если разрешено множественное наследование, иерархия представляет собой направленный ациклический граф (или сокращенно 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 . parts будут типизированы для хранения коллекции объектов, таких как экземпляры Body , Engine , Tires и т. д. Языки моделирования объектов, такие как UML, включают возможности моделирования различных аспектов «части» и других видов отношений - данных, таких как мощность объектов, ограничения на входные и выходные значения и т. д. Эта информация может использоваться инструментами разработчика для генерации дополнительного кода помимо основных определений данных для объектов, например, проверки ошибок наполучить и установить методы . [21]

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

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

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

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

Ортогональность концепции класса и наследования [ править ]

Хотя обычно предполагается, что языки на основе классов поддерживают наследование, наследование не является внутренним аспектом концепции классов. Некоторые языки, часто называемые « объектно-ориентированными языками », поддерживают классы, но не поддерживают наследование. Примеры объектно-ориентированных языков включают более ранние версии Visual Basic .

В рамках объектно-ориентированного анализа [ править ]

В объектно-ориентированном анализе и в UML , ассоциация между двумя классами представляет собой взаимодействие между классами или их соответствующих случаями. У ассоциаций есть направление; например, двунаправленная ассоциация между двумя классами указывает, что оба класса знают о своих отношениях. [24] Ассоциации могут быть помечены в соответствии с их названием или целью. [25]

Роль ассоциации является концом ассоциации и описывает роль соответствующего класса. Например, роль «подписчик» описывает способ, которым экземпляры класса «Человек» участвуют в ассоциации «подписывается на» с классом «Журнал». Кроме того, «Журнал» играет роль «журнала с подпиской» в той же ассоциации. Множественность ролей ассоциации описывает, сколько экземпляров соответствует каждому экземпляру другого класса ассоциации. Общие кратности: «0..1», «1..1», «1 .. *» и «0 .. *», где «*» указывает любое количество экземпляров. [24]

Таксономия классов [ править ]

Есть много категорий классов, некоторые из которых пересекаются.

Абстрактное и конкретное [ править ]

На языке, который поддерживает наследование, абстрактный класс или абстрактный базовый класс (ABC) - это класс, который не может быть создан, потому что он либо помечен как абстрактный, либо просто определяет абстрактные методы (или виртуальные методы ). Абстрактный класс может предоставлять реализации некоторых методов, а также может определять виртуальные методы через сигнатуры , которые должны быть реализованы прямыми или косвенными потомками абстрактного класса. Прежде чем класс, производный от абстрактного класса, может быть создан, все абстрактные методы его родительских классов должны быть реализованы каким-либо классом в цепочке производных. [26]

Большинство объектно-ориентированных языков программирования позволяют программисту определять, какие классы считаются абстрактными, и не позволяют создавать их экземпляры. Например, в Java , C # и PHP используется ключевое слово abstract . [27] [28] В C ++ абстрактный класс - это класс, имеющий по крайней мере один абстрактный метод, заданный соответствующим синтаксисом на этом языке (чистая виртуальная функция на языке C ++). [26]

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

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

Местные и внутренние [ править ]

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

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

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

Метаклассы [ править ]

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

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

Неклассифицируемые [ править ]

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

Неклассифицированный класс создается путем объявления класса как sealedв C # или как finalв Java или PHP. [39] [40] [41] Например, Stringкласс Java обозначен как final . [42]

Неклассифицированные классы могут позволить компилятору (на скомпилированных языках) выполнять оптимизацию, которая недоступна для подклассируемых классов. [43]

Открытый класс [ править ]

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

Миксины [ править ]

Некоторые языки имеют специальную поддержку миксинов , хотя на любом языке с множественным наследованием миксин - это просто класс, который не представляет отношения типа "есть-а-тип". Миксины обычно используются для добавления одних и тех же методов к нескольким классам; например, класс UnicodeConversionMixin может предоставлять метод unicode_to_ascii при включении в классы FileReader и WebPageScraper, которые не имеют общего родителя.

Частично [ править ]

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

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

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

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

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

Пример в VB.NET [ править ]

Этот простой пример, написанный на Visual Basic .NET , показывает, как части одного класса определены в двух разных файлах.

file1.vb
Частичный  класс  MyClass  Private  _name  As  String End  Class
file2.vb
Частичный  класс  MyClass  Public  Только для чтения  Имя свойства  () As String Get Return _name End Get End Property End Class          

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

Класс  MyClass  Private  _name  As  String  Public  Только для чтения  Имя свойства  () As String Get Return _name End Get End Property End Class          

Пример в Objective-C [ править ]

В Objective-C частичные классы, также известные как категории , могут даже распространяться на несколько библиотек и исполняемых файлов, как в следующем примере. Но ключевое отличие состоит в том, что категории Objective-C могут перезаписывать определения в другом объявлении интерфейса, и что категории не равны определению исходного класса (для первого требуется последнее). [46] Вместо этого частичный класс .NET не может иметь противоречивых определений, и все частичные определения равны другим. [45]

В Foundation файл заголовка NSData.h:

@interface  NSData  : NSObject-  ( id ) initWithContentsOfURL: ( NSURL  * ) URL ; // ...@конец

В пользовательской библиотеке, отдельный двоичный файл от платформы Foundation, файл заголовка NSData + base64.h:

#import <Foundation / Foundation.h>@interface  NSData  (base64)-  ( NSString  * ) base64String ; -  ( id ) initWithBase64String: ( NSString  * ) base64String ;@конец

А в приложении - еще один отдельный двоичный файл, файл с исходным кодом main.m:

#import <Foundation / Foundation.h> #import "NSData + base64.h"int  main ( int  argc ,  char  * argv []) {  если  ( argc  <  2 )  return  EXIT_FAILURE ;  NSString  * sourceURLString  =  [ NSString  stringWithCString : argv [ 1 ]];  NSData  * Данные  =  [[ NSData  Alloc ]  initWithContentsOfURL : [ NSURL  URLWithString : sourceURLString ]];  NSLog (@ "% @" ,  [ Данные  base64String ]);  вернуть  EXIT_SUCCESS ; }

Диспетчер найдет оба метода, вызываемых через экземпляр NSData, и правильно вызовет их оба.

Необоснованный [ править ]

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

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

Без имени [ править ]

Безымянный класс или анонимный класс является классом , который не связан с именем или идентификатором при определении. Это аналогично именованным функциям и безымянным .

Преимущества [ править ]

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

  • Быстрое развитие
  • Легкость обслуживания
  • Повторное использование кода и дизайна

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

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

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

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

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

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

См. Также [ править ]

  • Программирование на основе классов
  • Диаграмма классов (UML)
  • Список объектно-ориентированных языков программирования
  • Mixin
  • Объектно-ориентированного программирования
  • Программирование на основе прототипов
  • Черта (компьютерное программирование)

Примечания [ править ]

  1. ^ Гамма и др. 1995 , стр. 14.
  2. ^ a b Брюс 2002 , 2.1 Объекты, классы и типы объектов, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18 .
  3. ^ Гамма и др. 1995 , стр. 17.
  4. ^ Гамма и др. 1995 , стр. 14.
  5. ^ a b «3. Модель данных» . Справочник по языку Python . Фонд программного обеспечения Python . Проверено 26 апреля 2012 .
  6. ^ Буч 1994 , стр. 86-88.
  7. ^ "Классы (I)" . Учебник по языку C ++ . cplusplus.com . Проверено 29 апреля 2012 .
  8. ^ "Классы (II)" . Учебник по языку C ++ . cplusplus.com . Проверено 29 апреля 2012 .
  9. ^ Буч 1994 , стр. 105.
  10. ^ Jamrich, Парсонс, июнь (2015-06-22). Новые перспективы компьютерных концепций, 2016. Комплексное . Бостон, Массачусетс. ISBN 9781305271616. OCLC  917155105 .
  11. ^ a b «Управление доступом к членам класса» . Учебники по Java . Oracle . Проверено 19 апреля 2012 .
  12. ^ «OOP08-CPP. Не возвращать ссылки на личные данные» . CERT C ++ Secure Coding Standard . Университет Карнеги Меллон. 2010-05-10. Архивировано из оригинала на 2015-10-03 . Проверено 7 мая 2012 .
  13. Бен-Ари, Мордехай (24 января 2007). «2.2 Идентификаторы» (PDF) . Ошибки компиляции и выполнения в Java . Проверено 7 мая 2012 .
  14. ^ a b Дикий, Фред. «Интерфейсы C ++» . Доктора Добба . UBM Techweb . Проверено 2 мая 2012 .
  15. ^ Томас; Охота. «Классы, объекты и переменные» . Программирование на Ruby: Прагматичное руководство программиста . Ruby-Doc.org . Проверено 26 апреля 2012 .
  16. ^ «Дружба и наследство» . Учебник по языку C ++ . cplusplus.com . Проверено 26 апреля 2012 .
  17. ^ Буч 1994 , стр. 180.
  18. ^ Буч 1994 , стр. 128-129.
  19. ^ Буч 1994 , стр. 112.
  20. ^ a b «Интерфейсы» . Учебники по Java . Oracle . Проверено 1 мая 2012 .
  21. ^ Berfeld, Марьи (2 декабря 2008). «Преобразование UML в Java в редакциях IBM Rational Software Architect и сопутствующем программном обеспечении» . IBM . Проверено 20 декабря 2013 года .
  22. ^ Якобсен, Ивар; Магнус Кристерсон; Патрик Йонссон; Гуннар Овергаард (1992). Объектно-ориентированное программное обеспечение . Эддисон-Уэсли ACM Press. С.  43–69 . ISBN 0-201-54435-0.
  23. ^ Knublauch, Holger; Оберле, Даниэль; Тетлоу, Фил; Уоллес, Эван (2006-03-09). «Учебник по семантической паутине для разработчиков объектно-ориентированного программного обеспечения» . W3C . Проверено 30 июля 2008 .
  24. ^ а б Белл, Дональд. «Основы UML: диаграмма классов» . Разработчик Работает . IBM . Проверено 2 мая 2012 .
  25. ^ Буч 1994 , стр. 179.
  26. ^ a b «Полиморфизм» . Учебник по языку C ++ . cplusplus.com . Проверено 2 мая 2012 .
  27. ^ «Абстрактные методы и классы» . Учебники по Java . Oracle . Проверено 2 мая 2012 .
  28. ^ "Классовая абстракция" . Руководство по PHP . Группа PHP . Проверено 2 мая 2012 .
  29. ^ «Интерфейсы (Руководство по программированию на C #)» . Руководство по программированию на C # . Microsoft . Проверено 15 августа 2013 .
  30. ^ «Наследование (Руководство по программированию на C #)» . Руководство по программированию на C # . Microsoft . Проверено 2 мая 2012 .
  31. ^ «Вложенные классы (только C ++)» . XL C / C ++ V8.0 для AIX . IBM . Проверено 7 мая 2012 .
  32. ^ «Имена локальных типов (только C ++)» . XL C / C ++ V8.0 для AIX . IBM . Проверено 7 мая 2012 .
  33. ^ «Локальные классы (только C ++)» . XL C / C ++ V8.0 для AIX . IBM . Проверено 7 мая 2012 .
  34. ^ Буч 1994 , стр. 133-134.
  35. ^ «13 классов и метаклассов» . pharo.gforge.inria.fr . Проверено 31 октября 2016 .
  36. ^ Томас; Охота. «Классы и объекты» . Программирование на Ruby: Прагматичное руководство программиста . Ruby-Doc.org . Проверено 8 мая 2012 .
  37. ^ Буч 1994 , стр. 134.
  38. ^ «СС: Концепции» . Протокол MetaObject Common Lisp Object System . Ассоциация пользователей Лиспа. Архивировано из оригинала на 2010-11-15 . Проверено 8 мая 2012 .
  39. ^ "запечатанный (Справочник по C #)" . Справочник по C # . Microsoft . Проверено 8 мая 2012 .
  40. ^ «Написание заключительных классов и методов» . Учебники по Java . Oracle . Проверено 8 мая 2012 .
  41. ^ «PHP: последнее ключевое слово» . Руководство по PHP . Группа PHP . Проверено 21 августа 2014 .
  42. ^ «Строка (Java Platform SE 7)» . Платформа Java, Standard Edition 7: Спецификация API . Oracle . Проверено 8 мая 2012 .
  43. ^ Бренд, Sy. «Эффективность заключительных классов» . Блог команды Microsoft C ++ . Microsoft . Дата обращения 4 апреля 2020 .
  44. ^ «9. Классы» . Учебник по Python . Python.org . Проверено 3 марта 2018 . Как и в случае с модулями, классы обладают динамической природой Python: они создаются во время выполнения и могут быть изменены после создания.
  45. ^ a b c mairaw; Билл Вагнер; tompratt-AQ (19.09.2015), «Частичные классы и методы» , Руководство по программированию на C # , Microsoft , получено 8 августа 2018 г.
  46. ^ Apple (17 сентября 2014 г.), «Настройка существующих классов» , Программирование с помощью Objective-C , Apple , получено 8 августа 2018 г.
  47. ^ «Статические классы и члены статических классов (Руководство по программированию на C #)» . Руководство по программированию на C # . Microsoft . Проверено 8 мая 2012 .
  48. ^ "Что такое объект?" . oracle.com . Корпорация Oracle . Проверено 13 декабря 2013 года .
  49. ^ Буч, Грейди; Роберт А. Максимчук; Майкл В. Энгл; Бобби Дж. Янг, доктор философии; Джим Коналлен; Келли А. Хьюстон (30 апреля 2007 г.). Объектно-ориентированный анализ и дизайн с приложениями . Эддисон-Уэсли Профессионал. С. 1–28. ISBN 978-0-201-89551-3. Проверено 20 декабря 2013 года . Есть фундаментальные ограничивающие факторы человеческого познания; мы можем устранить эти ограничения с помощью декомпозиции, абстракции и иерархии.
  50. ^ Якобсен, Ивар; Магнус Кристерсон; Патрик Йонссон; Гуннар Овергаард (1992). Объектно-ориентированное программное обеспечение . Эддисон-Уэсли ACM Press. ISBN 0-201-54435-0.
  51. ^ "Международный стандарт C ++" (PDF) . Рабочий проект стандарта языка программирования C ++ . ISO / IEC JTC1 / SC22 WG21 . Дата обращения 5 января 2020 .

Ссылки [ править ]

  • Буч, Грэди (1994). Объекты и дизайн с приложениями, второе издание . Бенджамин / Каммингс.
  • Гамма; Шлем; Джонсон; Влиссидес (1995). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Эддисон Уэсли.
  • Брюс, Ким Б. (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 

Внешние ссылки [ править ]

  • Диас, Тьяго (октябрь 2006 г.). «Демонстрация программирования - .NET с использованием частичных типов для улучшения кода» . Hyper / Net . YouTube.