Отношения «быть частью» и «являться»
Теперь у нас появились две различные иерархии классов. Одну иерархию образует наследование классов, другую — вложенность классов.
Определив, какие классы будут написаны в вашей программе, и сколько их будет, подумайте, как спроектировать взаимодействие классов? Вырастить пышное генеалогическое дерево классов-наследников или расписать матрешку вложенных классов?
Теория ООП советует прежде всего выяснить, в каком отношении находятся ваши классы р и Q — в отношении «класс Q является экземпляром класса р» («a class Q is a class р») или в отношении «класс Q — часть класса р» («a class Q has a class P»).
Например: «Собака является животным» или «Собака — часть животного»? Ясно, что верно первое отношение «is-a», поэтому мы и определили класс Dog как расширение класса Pet.
Отношение «is-a» — это отношение «обобщение-детализация», отношение большей или меньшей абстракции, и ему соответствует наследование классов.
Отношение «has-a» — это отношение «целое-часть», ему соответствует вложение.