Можно столкнуться со сценарием, при котором удаление зависимости «друг» между двумя классами желательно, особенно из-за опасений по поводу чрезмерной взаимозависимости, проблем с обслуживанием и устаревших стандартов UML.
Извлеките методы, предоставляемые классом «Friend», и создайте новый абстрактный интерфейс. Установите отношение зависимости от класса «друг» к интерфейсу и зависимость «вызов» от другого класса к интерфейсу.
Переместите операции которые составляют зависимость «вызова» от зависимого класса к абстрактному интерфейсу. Сделайте интерфейс расширяющим защищенный конструктор в целях наследования и скройте ассоциацию защищенного обобщения между зависимым классом и интерфейсом.
На последнем этапе создайте метод в классе «друг», чтобы передать ссылку на абстрактный интерфейс в зависимый класс. Вызовите этот метод из зависимого класса во время инициализации, чтобы установить необходимое соединение.
ClassA (поставщик):
class ClassA : protected InternalInterface {
public:
attachAccessor(ClassAAccessor &accessor) {
accessor.setInternalInterfaceRef(*this);
}
};
ClassAAccessor (друг):
class ClassAAccessor {
public:
ClassAAccessor(ClassA& classA) : internalInterfaceRef(0) {
classA.attachAccessor(*this);
}
private:
InternalInterface* internalInterfaceRef;
};
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3