Myślę, że zaletą systemów typu strukturalnego jest to, że zachęcają do tworzenia precyzyjnych interfejsów zorientowanych na to, czego potrzebuje użytkownik interfejsu, a nie na to, co zapewnia implementator.
W mianowalnym systemie typów wymagana jest wspólna zależność od interfejsu. W systemie typu strukturalnego wymóg ten jest eliminowany: można zbudować luźno powiązany system bez potrzeby tworzenia wspólnej biblioteki, w której umieszczane są wszystkie interfejsy. Każdy klient może niezależnie zadeklarować interfejs, którego oczekuje od współpracownika.
Wadą systemów typu strukturalnego jest to, że dopasowują klasy do interfejsów, które mogą nie implementować poprawnej umowy. Na przykład, jeśli masz ten interfejs:
public interface IBananaProvider
{
/// Returns a banana, never null.
Banana GetBanana();
}
następnie dodaje klasy będą domyślnie uznawane wdrożyć IBananaProvider
w systemie typu strukturalnego. Jednak klasa narusza warunku pocztowy że wrócił banan jest nigdy zerowa:
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;
}
}
}
To może być ustalona, gdyby umowa została w jakiś sposób określony formalnie i traktowane jako część struktury typu. Myślę, że sprawy idą w tym kierunku, np. System.Diagnostics.Contracts w .NET 4.0.
Linki do Wikipedii: http://en.wikipedia.org/wiki/Structural_type_system http://en.wikipedia.org/wiki/Nominative_type_system –
To mówi mi, czym one są. Wiem o tym, będąc użytkownikiem, no cóż, wielu języków, które używają wariantów obu rodzajów. Co te strony nie mówią mi, jakie argumenty są używane do wspierania każdej strony i zburzyć drugą stronę. –
Tak, właśnie dostarczałem linki dla czytelników, którzy nie wiedzą o co chodzi. Może powinienem zamiast tego edytować pytanie. –