j'ai eu une idée similaire SM Kamran: Vous pouvez avoir une propriété Canvas
dans votre classe Shape
pour indiquer la toile à laquelle cette forme appartient, et une collection Shapes
dans votre classe Canvas
pour contenir une collection de formes:
Voici un exemple rapide:
interface ICanvas
{
// It's a good thing to use an interface
// in this phase. It will allow you greater
// freedom later.
}
class Canvas : ICanvas
{
private Shape.ShapeCollection _shapes;
public Collection<Shape> Shapes
{
get { return _shapes; }
}
public Canvas()
{
_shapes = new Shape.ShapeCollection(this);
}
}
class Shape
{
public class ShapeCollection : Collection<Shape>
{
private readonly ICanvas _parent;
public ShapeCollection(ICanvas parent)
{
_parent = parent;
}
protected override void InsertItem(int index, Shape item)
{
item._canvas = _parent;
base.InsertItem(index, item);
}
protected override void RemoveItem(int index)
{
this[index]._canvas = null;
base.RemoveItem(index);
}
protected override void SetItem(int index, Shape item)
{
RemoveAt(index);
InsertItem(index, item);
}
protected override void ClearItems()
{
while (this.Count != 0)
this.RemoveAt(this.Count - 1);
}
}
private ICanvas _canvas;
public ICanvas Canvas
{
get { return _canvas; }
}
}
En ajoutant une forme à une toile, Shape.Canvas
propriété sera automatiquement mis à jour:
Canvas canvas = new Canvas();
Shape circle = new Shape();
canvas.Shapes.Add(circle);
Notez que ShapeCollection
est une classe imbriquée à l'intérieur de Shape
, car c'est la seule façon de définir la propriété privée _canvas
.
collections génériques (comme Collection<Shape>
) sont souvent utilisés pour des problèmes similaires, parce que vous pouvez passer outre leurs propriétés InsertItem
/RemoveItem
ajouter des fonctionnalités personnalisées lorsque la collection est en cours de modification.
Vous pouvez également créer un singleton "Empty/Default Canvas" et l'utiliser à la place de null lorsque la forme n'est pas assignée à un vrai canvas (juste pour éviter de vérifier si Shape.Canvas
est nul à chaque fois).