Ess
Предположим у меня есть газон и на нем может стоять человек, (также человек может и не стоять на газоне), т.е. у газона всегда есть хозяин, но могут быть и другие люди без своего газона
Есть газон, есть человек. При разрушении газона человек остаётся. При разрушении человека газон остаётся. Сделай третий объект, который следит за людьми и газонами и знает, кто где стоит; у него же и методы для установления хозяев газонов и проверок, кто где стоит и у кого кто хозяин.
Ess
ЧЕЛОВЕК не является наследником класса ГАЗОН (он просто там стоит, но всегда стоит, как бы газон не может быть без человека) ваш пункт (2) не подойдет, от сюда следует что:
Газон - это человек? Нет. Значит, газон не производится от человека. Человек - это газон? Нет. Значит, человек не производится от газона. Так что наследования у них друг от друга не должно быть.
Ess
теперь я хочу знать на каком газоне стоит человек следовательно
Вот у третьего объекта и спроси.
Ess
тут нет проблем т.к. человек может существовать и сам без газона. задам умолчание (GAZON = None)
Газон тоже может сменить хозяина или остаться с разрушенным хозяином.
Ess
Предположим человек может покрасить свой газон, тут нет проблем - в ГАЗОН добавим свойство ЦВЕТ
и от ЧЕЛОВЕКА его можно изменить
Если газон принадлежит человеку, то человек может выполнить операцию над газоном “покрасить в цвет X”. Чтобы определить, принадлежит ли газон человеку, надо это спросить у третьего объекта. Чтобы выполнить операцию над газоном, надо над человеком выполнить операцию “покрасить газон X в цвет Y” и передать туда газон и цвет, а внутри операции над человеком нужно попросить газон покраситься, выполнив над газоном операцию “покрасить в цвет X”.
Ess
Это есть частая задача на больших проектах , в других языках (js, java, ++, #, delphi без проблем решаемая там есть директивы и явные указатели)
Тебе надо сделать интерфейсы. В идеале объекты не должны знать друг про друга ничего, даже о существовании друг друга они знать не должны. Закон Деметры изучи. Поэтому и человек, в идеале, даже знать не должен, что он красит. Он красит газон или забор? Он не знает. Он просто вызывает полиморфную операцию у какого-то объекта - “покрасить в цвет X”. А как приклеить незвестный объект к человеку? Через интерфейс. Есть какая-то хрень, которую можно покрасить, - это интерфейс. Любой объект, у которого есть операция “покрасить в цвет X”, может занять эту роль.
Ess
в других языках (js, java, ++, #, delphi без проблем решаемая
В других языках ты столкнёшься с тем же самым. Потому что ООП не зависит от языков, оно существует без них. И оно везде одинаковое и полноценное. А языки уже там как-то там его реализуют, какой-то лучше, какой-то хуже. Вот в питоне нет интерфейсов, а в Java есть. Поэтому в Java программировать в ООП гораздо легче, потому что там синтаксические конструкции для этого есть. В JavaScript посложнее, там прототипирование, поэтому наследование нужно делать в обход. В питоне ещё сложнее, потому что вообще половины конструкций нет, которые должны быть. В Go есть интерфейсы, но нет наследования. В C++ нет главного корневого класса, который должен быть. Но если в них чего-то нет, то это не значит, что этого нет в ООП.
Поэтому ты вот спрашиваешь “как засунуть человека в газон?”, а у меня возникает вопрос “а что он там вообще делать должен? это что, при разрушении газона человек умирает?”. Даже если его сагрегировать в газон, то получится, что человек является частью газона. И зачем это нужно? Человек-то всё равно не узнает никак, чьей частью он является, потому что есть человеки, не имеющие отношения к газонам. Так что тебе придётся и пронаследовать людей тогда, чтобы были люди, которые знают про газоны и умеют выполнять над газонами операции, и были люди, которые не знают про газоны.
Так что зря ты упрощаешь всё. Это плохо закончится. Для ООП синтаксическую запись класса недостаточно знать. Это капля в море. Верхушка айсберга.
Ess
и я хотел бы сделать декомпозицию классов на файловом уровне
Ну вот классов у тебя нет пока что. Вот класс Человеки, класс Газоны и класс Менеджеры. Можешь их разнести по разным файлам. В файле с классом Человеки нужно пронаследовать класс Человеки и получить производный класс ЧеловекиНаГазонах. У класса ЧеловекиНаГазонах должна быть определена операция “покрасить газон X в цвет Y”. А в файле запуска программы, где функция main() находится, ты делаешь импорт всех этих модулей и после этого строишь человеков, газоны и менеджера. В менеджере заносишь пары (газон, человек) через операцию над менеджером “назначить газону X хозяина Y”. Также менеджер тебе найдёт, кто кому принадлежит и кто чей хозяин (через операции над менеджером такие). Ну вот тогда у тебя получится. Всё будет просто и всё будет работать.