Это то, что делает шаблон декоратора. Он «украшает» существующий объект новыми атрибутами.
Итак, последний оформленный объект, который у вас есть, - это CD
объект, чей закрытый член computer
имеет тип Computer
. Но этот computer
объект создан Monitor
, у которого также есть закрытый член с именем computer
. Этот шаблон повторяется до тех пор, пока вы не достигнете исходного объекта Computer
.
Теперь, когда вы звоните description()
, вы делаете computer.description()
плюс некоторый текст для текущего класса. Этот первый вызов проходит по всей цепочке, пока вы не достигнете первого компьютерного объекта, который печатает computer
, затем and a disk
с объекта Disk
, а затем and a monitor
с объекта Monitor
и, наконец, and a CD
от объекта CD
.
Вы могли бы использовать новую переменную каждый раз и передавать этот объект в каждый последующий объект. Это зависит от того, что вы ищете. Здесь вы просто повторно используете переменную.
Это искусство ASCII может помочь вам понять отношения между объектами. computer
в каждом поле относится к частному члену каждого класса.
CD Monitor Disk Computer
__________ ___________ ___________ ___________
| computer-|---|->computer-|---|->computer-|---|->computer |
|__________| |___________| |___________| |___________|
Теперь в следующем искусстве ASCII вы видите, что печатает каждая «коробка». Стрелка сверху показывает порядок выполнения оператора возврата в каждом методе description()
. Стрелка между полями показывает порядок, в котором каждый метод description()
называется
order of print
<-------------------------------------------------------------------+
CD Monitor Disk Computer |
|
call from Main __________ _______________ ____________ __________ |
----------------> | and a cd |-->| and a monitor |-->| and a disk |-->| computer |----+
|__________| |_______________| |____________| |__________|
Надеюсь, мое дерьмовое искусство ASCII поможет:)