Вопрос знатокам ООП. - страница 35

 
Реter Konow:

А поперечные связи между классами-наследниками имеющие общий корень где то в глубине иерархии, как устанавливаются?

Например: Класс F и класс Z - конечные звенья цепочек наследования с общем корнем в иерархии, - классом A.

Как из класса F получить данные или методы класса Z? 

Никак. Нет такого. Но это и не нужно.

После создания объектов можно указатель одного объекта передать второму, а указатель второго первому.

Хотя, если разговор именно про класс, то через два двоеточия к чему угодно можно обратиться. Только зачем оно нужно? Кое когда, конечно нужно, но это крайне второстепенная возможность ООП.

 
Dmitry Fedoseev:

Никак. Нет такого. Но это и не нужно.

После создания объектов можно указатель оного объекта передать второму, а указатель второго первому.

Хотя, если разговор именно про класс, то через два двоеточия к чему угодно можно обратиться. Только зачем оно нужно?

Все зависит от того, какие задачи решает класс F. Может возникнуть ситуация, что данные или методы используемые в сторонней цепочке наследования могут пригодиться. 
 

Пример: Класс F хранит методы Цвет и Длинна, а Класс Z хранит методы Звук и Ширина.

Появляется Объект, у которого два свойства - Длинна и Ширина, но вычисляются они разных классах F и Z. Как быть? Создать отдельный класс с повторением этих методов, или как то к ним обращаться? (Через четырехточие?)

 
Реter Konow:

Пример: Класс F хранит методы Цвет и Длинна, а Класс Z хранит методы Звук и Ширина.

Появляется Объект, у которого два свойства - Длинна и Ширина, но вычисляются они разных классах F и Z. Как быть? Создать отдельный класс с повторением этих методов, или как то к ним обращаться? (Через четырехточие?)

Можно создать новый класс и включить в него классы F и Z. 

class F{
};

class Z{
};

class Y{
   public:
   F f;
   Z z;
}
 
Dmitry Fedoseev:

Можно создать новый класс и включить в него классы F и Z. 

Класс-"смычку"? Ясно. Спс.
 
Dmitry Fedoseev:

Можно создать новый класс и включить в него классы F и Z. 

А можно в классе, где нужны данные другого сделать метод получения указателя на нужный класс.

 
Реter Konow:
Класс-"смычку"? Ясно. Спс.

Можно просто получить указатель на нужный класс, и по указателю получить объект класса. Но нужно внимательно это делать - чтобы не получить указатель на пустой или новый объект класса.

 
Artyom Trishkin:

Можно просто получить указатель на нужный класс, и по указателю получить объект класса. Но нужно внимательно это делать - чтобы не получить указатель на пустой объект класса.

Тонкости. Ясно. Иерархия наследования удобна при четкой классифицируемости, предопределенности и однозначности данных. При усложнении объектов, могут появляться непредусмотренные в классах сочетания методов и свойств, что требует построения "смычек" - т.е. поперечных связей между классами. Это не всегда удобно и может ломать красивую схему распределения и заставлять ее пересматривать.  
 
Реter Konow:
Класс-"смычку"? Ясно. Спс.

В примере

class F{
};

class Z{
};

class Y{
   public:
   F f;
   Z z;
}

В классе Y содержатся переменные с типами класса F и Z.

Но если у вас уже где-то созданы и используются объекты классов F и Z, то в объекте Y вы не получите к ним доступа. В объекте Y будут новые два объекта классов F и Z.

А чтобы получить доступ к уже созданным ранее, и уже используемым объектам классов F и Z, нужно получить ссылки на объекты F и Z в классе Y - тогда класс Y сможет оперировать теми данными, которые уже записаны в F и Z, а не использовать новые и девственно чистые F и Z.

Но если вы сразу создаёте такой объект-смычку, то F и Z в нём дадут доступ к классам F и Z, и их заполнение нужно делать только через класс Y - опять-таки дать из него доступ к объектам F и Z, получить указатель на нужный объект и работать с ним по указателю.

 
Реter Konow:
Тонкости. Ясно. Иерархия наследования удобна при четкой классифицируемости, предопределенности и однозначности данных. При усложнении объектов, могут появляться не предусмотренные в классах сочетания методов и свойств, что требует построения "смычек" - т.е. поперечных связей между классами. Это не всегда удобно и может ломать красивую схему распределения и заставлять ее пересматривать.  

Ломать ничего не нужно - нужно добавить метод в класс, дающий указатель на требуемый объект другого класса.

В последних статьях я таким образом передаю в торговые объекты указатели на уже созданные ранее и работающие, и имеющие уже накопленные данные объекты класса коллекции символов и объекту текущего аккаунта. И торговый класс работает с ними так, как будто он их всегда имел.