Creo que la ventaja de los sistemas de tipo estructural es que lo alientan a crear interfaces de grano fino orientadas hacia lo que el usuario de la interfaz necesita, en lugar de lo que el implementador proporciona.
En un sistema de tipo nominativo necesita una dependencia común en la interfaz. En un sistema de tipo estructural, ese requisito se elimina: puede construir un sistema débilmente acoplado sin necesidad de crear esa biblioteca común donde coloca todas las interfaces. Cada cliente puede declarar independientemente la interfaz que espera de un colaborador.
La desventaja de los sistemas de tipo estructural es que combinan clases con interfaces que pueden no implementar el contrato correcto. Por ejemplo, si usted tiene esta interfaz:
public interface IBananaProvider
{
/// Returns a banana, never null.
Banana GetBanana();
}
entonces implícitamente se considerará lo siguiente clase para implementar IBananaProvider
en un sistema de tipo estructural. Sin embargo, la clase viola la condición post que el plátano regresado nunca es nula:
public class SomeBananaProvider
{
// returns a banana or null if we're all out
public Banana GetBanana()
{
if (bananas.Count > 0)
{
return bananas.RemoveLast();
}
else
{
return null;
}
}
}
Esto podría fijarse si el contrato se especifica alguna manera formal y considera parte de la estructura de tipo. Creo que las cosas se están moviendo en esa dirección, p. System.Diagnostics.Contracts en .NET 4.0.
Enlaces de Wikipedia: http://en.wikipedia.org/wiki/Structural_type_system http://en.wikipedia.org/wiki/Nominative_type_system –
Esto me dice cuáles son. Ya lo sé, siendo un usuario de, bueno, una gran cantidad de idiomas que usan variantes de ambos tipos. Lo que esas páginas no me dicen es qué argumentos se usan para apoyar a cada lado y derribar el otro lado. –
Sí, solo estaba proporcionando enlaces para el beneficio de lectores que no saben de qué se trata la pregunta. Tal vez debería haber editado la pregunta en su lugar. –