printКлассы

printОпределение. Отношения между классами

Понятия класса и объекта настолько тесно связаны, что невозможно говорить об объекте безотносительно к его классу. Однако существует важное различие этих двух понятий. В то время как объект обозначает конкретную сущность, определенную во времени и в пространстве, класс определяет лишь абстракцию существенного в объекте.
Класс – это некое множество объектов, имеющих общую структуру и общее поведение.
Любой конкретный объект является экземпляром какого-то класса. Даже если класс имеет только одного представителя, этот объект не является классом, хотя в некоторых случаях класс можно рассматривать как объект.
Важно отметить, что классы, как их понимают в большинстве существующих языков программирования, необходимы, но не достаточны для декомпозиции сложных систем. Некоторые абстракции так сложны, что не могут быть выражены в терминах простого описания класса. Например, на достаточно высоком уровне абстракции графический интерфейс пользователя, база данных или система учета как целое, это явные объекты, но не классы. Лучше считать их некими совокупностями сотрудничающих классов.
По своей природе, класс – это генеральный контракт между абстракцией и всеми ее клиентами. Выразителем обязательств класса служит его интерфейс, причем в языках с сильной типизацией потенциальные нарушения контракта можно обнаружить уже на стадии компиляции.
Идея контрактного программирования приводит к разграничению внешнего облика, то есть интерфейса, и внутреннего устройства класса, реализации. Главное в интерфейсе – объявление операций, поддерживаемых экземплярами класса. К нему можно добавить объявления других классов, переменных, констант и исключительных ситуаций, уточняющих абстракцию, которую класс должен выражать. Напротив, реализация класса никому, кроме него самого, не интересна. По большей части реализация состоит в определении операций, объявленных в интерфейсе класса.
Интерфейс класса обычно делится на три части:
  • открытую (public) – видимую всем клиентам;
  • защищенную (protected) – видимую самому классу, его подклассам и друзьям;
  • закрытую (private) – видимую только самому классу и его друзьям.
Разработчик может задать права доступа к той или иной части класса, определив тем самым зону видимости клиента. Структура объекта определяется в интерфейсной части класса, а не в его реализации, чтобы компилятор знал, сколько памяти необходимо выделить под объект. Если бы эта информация содержалась в реализации класса, нам пришлось бы написать реализацию полностью до определения его клиентов. То есть, весь смысл отделения интерфейса от реализации был бы потерян.
Классы, как и объекты, не существуют изолированно, они взаимодействуют разными способами. Между классами возникают иерархические отношения ("обобщение/специализация" и "целое/часть") и семантические, смысловые отношения, ассоциации.
Большинство объектно-ориентированных языков непосредственно поддерживают разные комбинации следующих видов отношений:
  • ассоциация;
  • наследование;
  • агрегация;
  • использование;
  • инстанцирование (параметризация);
  • метакласс.
loading