代码之家  ›  专栏  ›  技术社区  ›  fletcher

在Ruby中,什么等效于C#中的接口?

  •  21
  • fletcher  · 技术社区  · 14 年前

    有没有办法在Ruby中实现这种功能?

    谢谢

    我在C中的意思的一个简单例子:

    interface IConsole
    {
        int MaxControllers {get;}
        void PlayGame(IGame game);
    }
    
    class Xbox360 : IConsole
    {
       public int MaxControllers
       {
          get { return 4; }
       }
    
       public void PlayGame(IGame game)
       {
           InsertDisc(game);
           NavigateToMenuItem();
           Click();
       }
    }
    
    class NES : IConsole
    {
        public int MaxControllers
        {
            get { return 2; }
        }
    
       public void PlayGame(IGame game)
       {
           InsertCartridge(game);
           TurnOn();
       }
    }
    
    6 回复  |  直到 14 年前
        1
  •  25
  •   Marc-André Lafortune    14 年前

    ruby中没有接口,因为ruby是一种动态类型语言。接口基本上用于在不破坏类型安全的情况下使不同的类可互换。您的代码可以与每个控制台一起工作,只要它的行为类似于控制台(在C中,它意味着实现IConsole)“duck typing”是一个关键字,您可以使用它来跟上动态语言处理此类问题的方式。

    此外,您可以而且应该编写单元测试来验证代码的行为。每个物体都有一个 respond_to?

        2
  •  15
  •   Community CDub    5 年前

    鲁比有 接口

    这是一个抽象的规范的责任,保证和协议的一个单位的概念 interface

    区分两者是非常重要的。重要的是 ,而不是 接口 告诉你几乎没有什么有用的。没有什么比 标记接口 在Java中,哪些接口根本没有成员:请看一下 java.io.Serializable java.lang.Cloneable ; 那两个 接口 非常 不同的东西,但他们有 签名。

    所以,如果两个 接口 意思不同,签名相同,什么 接口 甚至向你保证?

    另一个很好的例子:

    interface ICollection<T>: IEnumerable<T>, IEnumerable
    {
        void Add(T item);
    }
    

    什么是 属于 System.Collections.Generic.ICollection<T>.Add

    • 以前收藏的所有物品都还在
    • item 在收藏中

    那些人中哪一个真的出现在 接口 ? 没有!房间里什么都没有 也就是说 Add 添加 总之,它也可以 去除

    这是一个完全有效的实现 :

    class MyCollection<T>: ICollection<T>
    {
        void Add(T item)
        {
            Remove(item);
        }
    }
    

    java.util.Set<E> 它真的说它是,你知道,一个 设置 ? 哪里都没有!或者更准确地说,在文档中。用英语。

    interfaces ,来自Java和.NET,所有 相关的 信息实际上是在文档中,而不是在类型中。所以,如果这些类型没有告诉你任何有趣的事情,为什么还要保留它们呢?为什么不坚持使用文档呢?鲁比就是这么做的。

    请注意,有 其他 使用的语言 实际上可以用一种有意义的方式来描述。但是,这些语言通常不调用描述 接口 接口 ,他们称之为 type . 例如,在依赖类型的编程语言中,可以表示 sort 函数返回与原始元素长度相同的集合,原始元素中的每个元素也在已排序的集合中,并且在较小的元素之前不会出现较大的元素。

    接口 但是有一个相当于Java的 接口 ,它与Java:documentation中的完全相同。

    而且,就像在爪哇一样, 验收试验 接口

    接口 物体的形状取决于它能做什么 ,不是什么 class module 它混合在一起。任何有 << Array 或者 String 而不是更复杂的 Logger ,尽管 数组 记录器 不共享明确的 接口 << .

    另一个例子是 StringIO 接口 作为 IO 因此 属于 File Object

        3
  •  5
  •   Mladen Jablanović    14 年前

    接口通常被引入到静态类型的OO语言中,以弥补多重继承的不足。换句话说,他们更多的是一个必要的邪恶,而不是有用的东西 本身 .

    1. 是带有“duck typing”的动态类型化语言,所以如果要调用 foo 在两个对象上,它们既不需要继承相同的祖先类,也不需要实现相同的接口。
    2. 通过mixin的概念支持多重继承,这里同样不需要接口。
        4
  •  4
  •   Matchu    14 年前

    鲁比并没有真正拥有它们;接口和契约通常更多地生活在静态世界中,而不是动态世界中。

    有一种宝石叫做 Handshake 如果你真的需要的话,可以执行非正式合同。

        6
  •  0
  •   supermitsuba    9 年前

    Jorg有一个很好的观点,ruby有接口,只是没有关键字。在阅读一些回复时,我认为这在动态语言中是否定的。您必须创建单元测试,而不是让编译器捕获未实现的方法,而不是通过该语言强制执行接口。这也使得理解方法更难推理,因为当你试图调用对象时,你必须找出它是什么。

    举个例子:

    def my_func(options)
      ...
    end