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

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

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

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

Джунад Али, Освоение шаблонов проектирования PHP [1]

Инкапсуляция [ править ]

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

Наследование [ править ]

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

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

Критика моделей на основе классов [ править ]

Языки, основанные на классах, или, если быть точнее, типизированные языки , где создание подклассов является единственным способом создания подтипов , подвергались критике за смешение реализаций и интерфейсов - важнейший принцип объектно-ориентированного программирования. Критики говорят, что можно создать класс мешка, который хранит коллекцию объектов, а затем расширить его, чтобы создать новый класс, называемый классом набора, в котором устранено дублирование объектов. [2] [3] Теперь функция, которая принимает объект класса мешка, может ожидать, что добавление двух объектов увеличит размер мешка на два, но если один передает объект заданного класса, то добавление двух объектов может увеличивать или не увеличивать размер мешка. сумка на двоих. Проблема возникает именно потому, что создание подклассов подразумевает создание подтипов даже в тех случаях, когда принцип подтипа, известный как принцип подстановки Лискова , не выполняется. Барбара Лисков и Жаннетт Винг кратко сформулировали принцип в статье 1994 года следующим образом:

Требование к подтипу : пусть будет доказуемым свойством для объектов типа . Тогда должно быть верно для объектов типа, где является подтипом .

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

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

Примеры языков [ править ]

Хотя Simula представила абстракцию классов, каноническим примером языка на основе классов является Smalltalk . Другие включают PHP , C ++ , Java , C # и Objective-C .

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

  • Программирование на основе прототипов (контраст)
  • Парадигмы программирования
  • Класс (компьютерное программирование)

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

  1. Али, Джунаде. Освоение шаблонов проектирования PHP | PACKT Книги (1-е изд.). Бирмингем, Англия, Великобритания: Packt Publishing Limited. п. 11. ISBN 978-1-78588-713-0. Проверено 11 декабря 2017 года .
  2. Киселев, Олег. «Подтипы, подклассы и проблемы с ООП» . Проверено 7 октября 2012 года .
  3. ^ Дюкасс, Стефан. «Набор не может быть подтипом сумки» . Проверено 7 октября 2012 года .