Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Отношения между классами
Класс, как не раз отмечалось, играет две роли: он является модулем - архитектурной единицей, и он имеет содержательный смысл, определяя некоторый тип данных. Продолжая аналогию с ролями, заметим, что программная система, представляющая собой множество классов, является ансамблем, в котором каждый класс играет свою роль не независимо, а во взаимодействии с другими актерами этого ансамбля. Классы программной системы находятся в определенных отношениях друг с другом. Два основных типа отношений между классами определены в ОО-системах. Первое отношение, " клиенты и поставщики", называется часто клиентским отношением или отношением вложенности (встраивания). Второе отношение, " родители и наследники", называется отношением наследования. Определение 1. Классы A и В находятся в отношении " клиент - поставщик", если одним из полей класса В является объект класса А. Класс А называется поставщиком класса В, класс В называется клиентом класса А. Следуя этому определению, объект класса A " вложен" в класс B. По этой причине отношение " клиент - поставщик" называют также отношением вложенности или встраивания. Заметим сразу, что помимо вложенности поля, могут существовать и другие способы взаимодействия двух классов, связывающие их отношением " клиент - поставщик". Определение 2. Классы А и В находятся в отношении " родитель - наследник", если при объявлении класса В класс А указан в качестве родительского класса. Класс А называется родителем класса В, класс В называется наследником класса А. Оба отношения, наследования и вложенности, являются транзитивными. Если В - клиент А и С - клиент В, то отсюда следует, что С - клиент А. Если В - наследник А и С - наследник В, то отсюда следует, что С - наследник А. Определения 1 и 2 задают прямых или непосредственных клиентов и поставщиков, прямых родителей и наследников. Вследствие транзитивности необходимо ввести понятие уровня. Прямые клиенты и поставщики, прямые родители и наследники относятся к соответствующему уровню 1 (клиенты уровня 1, поставщики уровня 1 и так далее). Затем следует рекурсивное определение: прямой клиент клиента уровня k относится к уровню k+1. Для отношения наследования используется терминология, заимствованная из естественного языка. Прямые классы-наследники часто называются сыновними или дочерними классами. Непрямые родители называются предками, а их непрямые наследники - потомками. Отношения " является" и " имеет" При проектировании классов часто возникает вопрос, какое же отношение между классами нужно построить. Рассмотрим совсем простой пример двух классов - Square и Rectangle, описывающих квадраты и прямоугольники. Наверное, понятно, что эти классы следует связать скорее отношением наследования, чем вложенности. Еще один пример двух классов - Car и Person, описывающих автомобиль и персону. Какими отношениями с этими классами должен быть связан класс Person_of_Car, описывающий владельца машины? Может ли он быть наследником обоих классов? Найти правильные ответы на эти вопросы проектирования классов помогает понимание того, что отношение " клиент - поставщик" задает отношение " имеет" (" has"), а отношение наследования задает отношение " является" (" is a"). В случае классов Square и Rectangle понятно, что каждый объект квадрат " является" прямоугольником, поэтому между этими классами существует отношение наследования и родительским классом является класс Rectangle, а класс Square является его потомком. В случае автомобилей, персон и владельцев авто также понятно, что владелец " имеет" автомобиль и " является" персоной. Поэтому класс Person_of_Car является клиентом класса Car и наследником класса Person.
|