Ho una classe Container
contenente oggetti di tipo Item
. Sono classi diverse e in particolare non hanno una classe base comune (ad esempio, una Container
non ha una Container
).:
class Container
{
public ICollection<Item> Items { get { /* ... */ } }
}
class Item
{
public Container Container { get { /* ... */ } }
}
Mi piacerebbe far rispettare che ogni Item
deve avere esattamente un Container
, e mi piacerebbe assicurarmi che non ci possa mai essere una situazione incoerente tale che, ad es. i.Container.Items.Contains(i)
restituisce false.
Questo potrebbe essere fatto ad es. aggiungendo un metodo Container.AddItem
che imposta di conseguenza la proprietà Item
Container
o un metodo Item.SetContainer
che si presta a Container.Items
.
Esempio:
class Item
{
private Container container;
public Container Container
{
get
{
return container;
}
set
{
if (container != null)
container.Items.Remove(this);
container = value;
if (value != null)
value.Items.Add(this);
}
}
}
Questo potrebbe essere fatto facilmente con il concetto di "amico", ma sto usando C # che non ha amici, e quindi questo codice di esempio non verrà compilato. Tuttavia, ovviamente sarebbe compilato se Container.Items
avesse un setter pubblico, ma questo di nuovo consentirebbe incongruenze: un "utente" delle classi avrebbe bisogno di sapere di non usare il settatore di Container.Items
, ma Item.Container
invece.
Dopo aver cercato per un po 'di tempo, sento che non c'è modo di far rispettare questa restrizione che sembra essere così banale. (L'utilizzo di internal
potrebbe essere una soluzione, ma nessuna soluzione.)
C'è un modo elegante per applicare questa regola di un contenitore per oggetto senza il concetto di "amico"?