Supponiamo di avere tre classi, come follwing:
class A {
Array<B> bs;
createB() { b = new B(); this.bs.insert(b); return b; }
}
class B {
Array<C> cs;
createC() { c = new C(); this.cs.insert(c); return c; }
}
class C {
delete() { ... }
}
A tiene Bs e B tiene Cs. C ha un metodo di cancellazione su cui per una data C, c, voglio cancellare la sua B dalla A che alla fine tiene c.
Un modo semplice per farlo è di mantenere un riferimento all'indietro sull'oggetto titolare. In questo modo, il metodo di cancellazione di C può essere scritto come:
delete() { this.b.a.bs.remove(this.b); }
Ma mi trovo con una dipendenza circolare in cui ogni classe è a conoscenza degli altri. Voglio che qualsiasi classe inferiore non sia a conoscenza della sua classe di proprietari.
Qualche idea su come risolvere questo più elegantemente? Gradirei anche una soluzione che possa essere applicata su una gerarchia più grande di solo tre classi.
Modifica: Potrei non essere stato abbastanza chiaro, ma il mio punto è che la classe C è un "ricevitore azione", come un pulsante sullo schermo con molte opzioni su cui fare clic. A e B sono più di un elemento logico che non ha la rappresentazione dello schermo ma i dati di gruppo insieme.
Supponiamo che B abbia un attributo shape e C abbia un attributo color.
Voglio poter fare clic su C e fornire questi metodi (solo alcuni esempi inventati):
Delete() { go to B, and delete this C from it array }
PaintAllRed() { go to B, for each C set color red }
ShapeSquare() { go to B, go to it's A, for each B of A set shape square }
In sostanza voglio sapere come può C informare B (e A) che un'azione è stata fatta dall'utente.