2009-12-01 9 views
3

Je crée une hiérarchie d'objets qui représente une table qui dessine sur un contrôle. Ma hiérarchie ressemble à ceci:Quel dessin devrais-je utiliser pour qu'une classe puisse interroger l'un de ses ancêtres?

Table has multiple pages 
Page has multiple lines 
Line has multiple cells 
Cell has multiple glyph 

Je veux avoir une option (un paramètre) sur la table pour filtrer la colonne (cellules) affiche. Le code client peut faire quelque chose comme ceci:

myTable.ShowColumns(8,12) // Will display columns 8 to 12 

Affichage et placer des cellules sur le contrôle est la responsabilité des lignes objects.How puis-je passer les informations dont les cellules doivent être affichés à partir de l'objet Table au Objet de ligne?

Devrais-je donner à chaque ligne une référence à l'objet table? Devrais-je essayer de transmettre les informations à chaque ligne à travers la hiérarchie à chaque fois que Table.ShowColumns() est appelée?

Il doit y avoir une manière élégante?

+0

Utilisez-vous l'héritage pour cela, il s'agit clairement d'une relation Has-A et non d'une relation Is-A. Si vous utilisez l'héritage, à quoi ressemble la hiérarchie des classes? –

Répondre

2

Je ne pense pas qu'il y ait besoin d'un motif de conception. (Ou je ne l'appellerais pas de cette façon) Pourquoi n'utilisez-vous pas simplement le double lien où childs lien vers le parent et vice versa?

+0

Salut Patrick, Merci pour votre réponse, je suis d'accord avec vous motif de conception n'était pas le bon terme pour ce que je cherchais. J'aime votre idée d'avoir un lien de l'enfant aux parents. –

1

Si je comprends bien, ce que vous appelez ancêtres sont en fait les parents dans la hiérarchie - qui en effet, si rien de plus qu'un tree. Et avec les arbres, il est courant que les nœuds enfants référencent leurs parents respectifs. En ce qui concerne la conception de la fonction ShowColumns, je pense qu'elle devrait modifier une variable d'état interne de la classe Lines (qui contient les cellules) en vertu d'un appel de fonction interne similaire sur la classe Lines.

// something like this.. 
Table.ShowCollumns -> Table.m_lines.SetVisibleColumns -> (modify visible columns) 

Il est évident que, selon la cartographie logique des colonnes des pages et des pages aux tables, vous pouvez avoir à intervenir encore un autre appel avant d'appeler SetVisibleColumns sur les lignes classe, afin de trouver le bon objet de la page: Table.FindPageWithColumns(...) et ensuite opérer sur celui-là.