在Ruby中,C#中的接口相当于什么?

fle*_*her 21 c# ruby interface contract equivalent

我目前正在尝试学习Ruby,并且我正在尝试更多地了解它在封装和合同方面提供的内容.

在C#中,可以使用接口定义合同.实现接口的类必须通过为每个定义的方法和属性(以及可能的其他内容)提供实现来满足合同中的条款.实现接口的单个​​类可以在合同定义的方法范围内执行任何需要,只要它接受相同类型的参数并返回相同类型的结果.

有没有办法在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();
   }
}
Run Code Online (Sandbox Code Playgroud)

Zeb*_*ebi 25

ruby中没有接口,因为ruby是一种动态类型语言.接口基本上用于使不同的类可互换而不会破坏类型安全性.您的代码可以与每个控制台一起使用,只要它像C#中的控制台一样实现IConsole."duck typing"是一个关键字,你可以用它来赶上处理这类问题的动态语言方式.

此外,您可以并且应该编写单元测试来验证代码的行为.每个对象都有一个respond_to?可以在断言中使用的方法.

  • 动态类型与此无关.看一下php,它是动态的,并且有接口.为什么ruby人不能接受语言中缺少某些功能?缺少另一个功能:类型提示. (7认同)

Jör*_*tag 15

Ruby拥有接口,就像任何其他语言一样.

请注意,您必须小心不要混淆Interface的概念,这是一个单元的职责,保证和协议的抽象规范,其概念interface是Java,C#和VB.NET编程中的关键字.语言.在Ruby中,我们一直使用前者,但后者根本不存在.

区分这两者非常重要.重要的是界面,而不是interface.该interface告诉你几乎没有什么用处.没有什么比Java中的标记接口更好地证明了这一点,它们是完全没有成员的接口:只需看看java.io.Serializablejava.lang.Cloneable; 这两个interface有什么恶意非常不同的事情,但他们有完全相同的签名.

所以,如果两个interfaces表示不同的含义,具有相同的签名,有什么确切的是interface,即使你保证?

另一个好例子:

interface ICollection<T>: IEnumerable<T>, IEnumerable
{
    void Add(T item);
}
Run Code Online (Sandbox Code Playgroud)

是什么接口System.Collections.Generic.ICollection<T>.Add

  • 集合的长度不会减少
  • 之前收集的所有物品仍然存在
  • item是在集合中

哪些实际出现在interface?没有!没有任何内容interface说该Add方法甚至必须添加,它也可以从集合中删除一个元素.

这是一个非常有效的实现interface:

class MyCollection<T>: ICollection<T>
{
    void Add(T item)
    {
        Remove(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个例子:java.util.Set<E>它实际上在哪里说它是,你知道,它是一套?无处!或者更确切地说,在文档中.用英语讲.

interfacesJava和.NET的几乎所有情况下,所有相关信息实际上都在文档中,而不是在类型中.那么,如果类型不告诉你任何有趣的东西,为什么要保留它们呢?为什么不坚持文档?而这正是Ruby所做的.

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

简而言之:Ruby没有Java的等价物interface.但它确实具有Java 接口的等价物,并且与Java:文档中的完全相同.

此外,就像在Java中一样,Acceptance Tests也可用于指定接口.

特别是,在Ruby中,对象的接口由它可以什么决定,而不是class它是什么,或module它混入什么.任何具有<<方法的对象都可以被附加到.这在单元测试中非常有用,在单元测试中,你可以简单地传入一个Array或一个String而不是一个更复杂的Logger,即使Array并且除了它们都有一个被调用的方法这一事实之外Logger不要共享.interface<<

另一个例子是StringIO,它实现了相同的接口作为IO和因此的大部分接口File,但是没有除了共享任何共同的祖先Object.

  • 是的,文档可以描述一个类应该做什么,但它不保证任何东西.使用接口实现,您可以确保Add(item)方法至少存在.它是否执行你期望*它执行的功能是无关紧要的.你知道,如果你调用Add(item),它会在那里,它会做一些事情.以上听起来像一个松散的宗教论点. (10认同)

Mla*_*vić 5

接口通常被引入静态类型的OO语言,以弥补多重继承的缺失.换句话说,他们更的必要之恶比一些有用的东西本身每.

另一方面,Ruby:

  1. 动态类型语言是"duck typing",所以如果你想foo在两个对象上调用方法,它们既不需要继承相同的祖先类,也不需要实现相同的接口.
  2. 通过mixins的概念支持多重继承,这里也不需要接口.