Как правило, вы можете сначала использовать язык природы для описания отношений между компонентами, которые в последнее время представлены в виде классов, а затем использовать определенные диаграммы для представления этих отношений. Если на ваших диаграммах соединены два компонента, они должны иметь определенное соединение в вашей программе. В вашем случае вы можете определить, является ли «двигатель» экземпляром «автомобиля», а «система охлаждения» является экземпляром «двигателя», наблюдая, есть ли связи между этими компонентами на диаграмме. (Этот процесс фактически является интуицией языка моделирования ОО, такого как UML.)
На самом деле, я не вижу ничего плохого в вашем коде. Я не автомобильный человек, поэтому я могу ошибаться в понимании системы. Но если двигатель реального автомобиля нуждается в системе охлаждения, я думаю, что вы делаете правильно. Да, класс «engine» действительно вызывает свойство класса «система охлаждения», но поскольку «engine» использует открытый метод для вызова «системы охлаждения», это правильный путь. Опять же, я не знаю реальную автомобильную систему, поэтому я могу ошибаться в этом конкретном дизайне.