2015-04-23 9 views
11

Ho questo BdlTabItem che riceve un parametro di tipo DockableUserControl e vorrei sapere se è una cattiva pratica creare un riferimento circolare tra i due utilizzando uc.TabItem = this e new BdlDockableWindow(this) prima che il costruttore termini.È una cattiva pratica passare "questo" come parametro all'interno del proprio costruttore?

So che questo comportamento può essere considerato molto negativo con codice nativo non gestito (C++). Quindi, anche se non avevo avvertimenti o errori, chiedo qui se dovessi farlo o meno.

public BdlTabItem(BdlTabControl parent, DockableUserControl uc, string title) 
    { 
     TabControlParent = parent; 
     UserControl = uc; 
     WindowParent = new BdlDockableWindow(this); 

     this.Content = UserControl; 

     UserControl.TabItem = this; 
    } 
+5

Vedere http://codeblog.jonskeet.uk/2010/09/02/don-t-let-this-get-away/ per un post sul blog ho scritto sull'argomento piuttosto tempo fa. –

+0

@ Kilouco: nella maggior parte dei casi pratici non ci dovrebbero essere problemi con questo approccio. –

+0

"So che questo comportamento non è nemmeno possibile con C++" ... Continuo a essere stupito dai fatti scorretti che le persone "sanno". Certamente, in C++ c'è una differenza ... l'oggetto in costruzione ha un tipo dinamico del tipo il cui costruttore è in esecuzione, non il tipo più derivato. Ma ancora, perdere 'questo' durante la costruzione del C++ è abbastanza possibile. –

risposta

3

Questo è accettabile, ma solleva domande. Perché l'elemento scheda crea un'istanza di un nuovo WindowParent ma il controllo scheda padre non ha un riferimento ad esso? O perché la finestra madre non è passata una proprietà sul controllo utente? Sembra che il comportamento dovrebbe essere altrove.

+0

Forse usare un modello di fabbrica farebbe meglio qui? Ho davvero bisogno di tutto ciò che è connesso in modo da poter avere riferimenti da qualsiasi punto su questo albero logico. –

+0

@ Kilouco avendo i riferimenti va bene, ma avere qualcosa che ha bisogno di un riferimento anche essere responsabile dell'istanziazione dell'oggetto è un po 'sospetto. È strano avere un elemento di tabulazione per istanziare una finestra. Potrei raccomandare [Code Review] (http://codereview.stackexchange.com)? – moarboilerplate

+0

Si potrebbe rendere la finestra genitore una proprietà del controllo utente (se è lì che appartiene - sembra che lo faccia). Quindi basta fare riferimento alla finestra internamente utilizzando il controllo utente o, nel costruttore, impostare una proprietà sul tabitem sulla proprietà sul controllo utente. Non è necessario necessariamente disporre di tutto ciò che è necessario per accedere direttamente a un costruttore, ma possono anche essere proprietà sugli oggetti che si inoltrano ai costruttori. – moarboilerplate

Problemi correlati