Sono comode per simulare l'ereditarietà multipla.
Esempio: il padre di un container può essere di tipo Grid o item; per poter castare il parent del container a qualcosa e richiamare un metodo uguale su grid e item, ho dovuto definire una interfaccia generica che prevede il metodo, specificare che grid e item la implementano, castare il parent all'interfaccia e richiamare il metodo.
public interface IGenericElement
{
GenericGrid Grid();
IGenericElement Father();
}
public partial class GenericGrid : System.Web.UI.UserControl, IGenericElement
{
...
public GenericGrid Grid()
{
return this;
}
public IGenericElement Father()
{
return this;
}
...
}
public partial class GenericContainer : System.Web.UI.UserControl, IGenericElement
{
...
public GenericGrid Grid()
{
return ((IGenericElement) Parent).Grid();
}
public IGenericElement Father()
{
// container father could be a grid or an item
return (IGenericElement) Parent;
}
espongo una proprietà della griglia attraverso il container:
public Boolean IsInList
{
get { return Grid().IsList ; }
}
}
public abstract partial class GenericItemBase : System.Web.UI.UserControl, IGenericElement
{
...
public GenericGrid Grid()
{
return ((IGenericElement) Parent).Grid();
}
public IGenericElement Father()
{
// item father is always a container
return (IGenericElement)Parent;
}
espongo una property della grid attraverso l'item:
public Boolean IsInList
{
get { return Grid().IsList; }
}
espongo una property del container padre (item contenuti solo in container) attraverso l'item:
public Boolean IsInNestedContainer
{
get { return ((GenericContainer) Father()).NestChildren; }
}
NOTA: l'interfaccia specifica metodi, non property.