JUS*_*ION 6 computer-science language-design type-equivalence
在语言设计界,曾经有过一场关于语言是否应该使用结构等价或名称等同的长期争论.像ALGOL或ML或Modula-3这样的语言使用了结构等价,而......很多大多数编程语言都使用命名等价(包括Modula-2).
支持结构等价的典型论据是什么?反对它的典型论点是什么?支持名称对等的典型论据是什么?反对它的典型论点是什么?
我认为结构类型系统的优势在于它们鼓励您创建面向接口用户需要的细粒度接口,而不是实现者提供的接口.
在主格类型系统中,您需要对接口具有共同依赖性.在结构类型系统中,要求被消除:您可以构建一个松散耦合的系统,而无需创建放置所有接口的公共库.每个客户端都可以独立地从协作者声明它所期望的接口.
结构类型系统的缺点是它们将类与接口匹配,这可能无法真正实现正确的合同.例如,如果您有此界面:
public interface IBananaProvider
{
   /// Returns a banana, never null.
   Banana GetBanana();
}
那么下面的类将被隐含地考虑IBananaProvider在结构类型系统中实现.但是,该类违反了返回的banana永远不为null的post条件:
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;
        }
    }
} 
如果合同以某种方式正式指定并被视为类型结构的一部分,则可以修复此问题.我认为事情正朝着这个方向发展,例如.NET 4.0中的System.Diagnostics.Contracts.