代码之家  ›  专栏  ›  技术社区  ›  Srinivas Reddy Thatiparthy

为什么我们不需要动态语言的接口呢?

  •  17
  • Srinivas Reddy Thatiparthy  · 技术社区  · 16 年前

    仅仅是因为动态类型,我们不需要python中的接口概念(比如Java和C#)?

    9 回复  |  直到 16 年前
        1
  •  23
  •   hallucinations    9 年前

    这个 interface 作为关键字和工件是由Java引入的 1 (C#从这里开始)来描述一个对象必须遵守的契约是什么。

    但是,接口一直是面向对象范例的关键部分,它基本上代表了对象必须响应的方法。Java只是强制这种机制来提供静态类型检查。

    使用接口,即使他们不静态检查它们。就像其他数据类型一样,例如在Ruby中:

     @i = 1;
    

    你不必申报 i 类型 FixNum

    另一方面 Structural type

    关键字

        2
  •  5
  •   gomad    16 年前

    我们没有 他们,但我们有 他们。退房 Zope Interfaces

        3
  •  1
  •   Grzenio    16 年前

    静态类型语言中使用接口来描述两个原本独立的对象“实现相同的行为”。在动态类型语言中,我们隐式地假设当两个对象有一个具有相同名称/参数的方法时,它执行相同的操作,因此接口没有任何用处。

        4
  •  1
  •   RHSeeger    16 年前

    值得注意的是,与许多人第一次响应时所说的相反,接口可以用来做的不仅仅是记录“类支持什么方法”。格泽尼奥用“实施同样的行为”的措词触及了这一点。作为一个具体的例子,看看Java接口Serializable。它没有实现任何方法;相反,它被用作一个“标记”来指示类可以安全地序列化。

        5
  •  1
  •   Donal Fellows    16 年前

    至少有些动态语言使显式接口有点尴尬,其中一个关键点是,动态语言通常可以响应事先不知道的消息(呃,方法调用),甚至可以动态创建方法。要知道对象是否会正确响应消息,唯一真正的方法是向它发送消息。这没关系,因为动态语言认为支持这类东西比静态类型检查更好;对象被认为在特定协议中可用,因为已知其能够参与该协议(例如,通过另一消息给出)。

        6
  •  1
  •   Owen S.    16 年前

    也就是说,接口作为 概念 在动态世界中仍然非常重要,但它们通常只是在文档中定义,而不是由语言强制执行。偶尔,我也会看到程序员实际制作了一个基类来勾勒出这个接口;这有助于文档的形式化,如果接口的一部分可以用接口的其余部分来实现,那么它就特别有用。

        7
  •  1
  •   user94437    14 年前

    Perl有角色(或特性),它不仅仅是接口不同于javaperl角色我们可以有一个实现查看这些链接了解更多关于Perl角色的信息

        8
  •  0
  •   Powerlord    16 年前
        9
  •  0
  •   Jürgen Steinblock    16 年前

    如果它像鸭子一样走路嘎嘎叫

    http://en.wikipedia.org/wiki/Duck_typing

    换句话说,如果您执行一个对象来支持Delete()方法,那么您可以只使用

    obj.Delete()
    

    方法,但如果对象不支持Delete(),则会出现运行时错误。静态类型语言不允许这样做,并抛出编译时错误。因此,您基本上是以类型安全性来换取更快的开发时间和灵活性。

    如果没有接口,您可以在静态语言中执行类似操作:

    void Save(MyBaseClass item)
    {
        if (item.HasChanges)
            item.Save()
    }
    

    但这需要传递给此方法的每个对象都从MyBaseClass继承。因为Java或C不支持多重继承,这不是很灵活,因为如果你的类已经继承了另一个类,它也不能从MyBaseClass继承。因此,更好的选择是创建一个ISavable接口,并接受它作为输入参数,以确保可以保存该项。那么你就拥有了两者中最好的:类型安全性和灵活性。

    public interface ISavable
    {
        bool HasChanges {get;set;}
        void Save();
    }
    
    void Save(ISavable item)
    {
        if (item.HasChanges)
            item.Save()
    }
    

    最后一个后门是使用object作为参数,如果您不能期望使用save方法实现接口的每个项。

    void Save(object item)
    {
        if (item.HasChanges)
            item.Save()
    }
    

    推荐文章