当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-11 00:19:57 C#

什么是C#中Ruby中的接口?我目前正在尝试学习Ruby,并且我正在尝试更多地了解它在封装和契约方面必须提供的内容。在C#中,可以使用接口定义契约。实现接口的类必须通过为每个已定义的方法和属性(可能还有其他)提供实现来满足契约条款。实现接口的单个??类可以在契约定义的方法范围内做任何它想做的事情,只要它接受相同类型的参数并返回相同类型的结果。有没有办法在Ruby中强制执行类似的操作?感谢我在C#中的简单示例:interfaceIConsole{intMaxControllers{get;}voidPlayGame(IGamegame);}classXbox360:IConsole{publicintMaxControllers{get{return4;}}publicvoidPlayGame(IGame游戏){InsertDisc(游戏);NavigateToMenuItem();点击();}}classNES:IConsole{publicintMaxControllers{get{return2;}}publicvoidPlayGame(IGame游戏){InsertCartridge(游戏);();}}Ruby中没有接口,因为Ruby是一种动态类型语言。接口基本上用于在不破坏类型安全的情况下使不同的类可以互换。只要您的代码像C#中的控制台一样实现IConsole,您的代码将适用于每个控制台。“鸭子打字”是一个关键字,您可以使用它来捕捉处理此类问题的动态语言方式。此外,您可以而且应该编写单元测试来验证代码的行为。每个对象都有一个respond_to?可以在断言中使用的方法。Ruby有接口,就像任何其他语言一样。请注意,您必须注意不要混淆接口的概念,它是一个单元的职责、保证和协议的抽象规范,与接口的概念,它是Java、C#和VB.NET中的关键字。编程语言。在Ruby中,我们一直使用前者,但后者根本不存在。区分两者非常重要。重要的是界面,而不是界面。接口告诉你几乎没用。没有什么比Java中的标记接口更好地证明这一点了,它们是根本没有成员的接口:看看java.io.Serializable和java.lang.Cloneable;这两个接口的含义非常不同,但它们具有完全相同的签名。那么,如果两个接口意味着不同的东西,具有相同的签名,那么接口究竟向你保证了什么?另一个很好的例子:interfaceICollection:IEnumerable,IEnumerable{voidAdd(Titem);}System.Collections.Generic.ICollection.Add的接口是什么?哪些实际出现在界面中?不!界面中没有任何内容表明Add方法甚至必须添加,它还可以从集合中删除元素。这是该接口的一个完全有效的实现:classMyCollection:ICollection{voidAdd(Titem){Remove(item);另一个例子:在java.util.Set中它实际上说它是一个集合?无处!或者更准确地说,在文档中。用英语。几乎所有接口都来自Java和.NET,所有相关信息实际上都在文档中,而不是在类型中。那么,如果它们没有告诉您任何有趣的事情,为什么还要保留这些类型呢?为什么不坚持文档?而这正是Ruby所做的。请注意,还有其他语言可以实际以有意义的方式描述接口。但是,这些语言一般不把描述接口的构造称为“接口”,它们称之为类型。在依赖类型的编程语言中,您可以例如表示排序函数返回一个与原集合长度相同的集合,原集合中的每个元素也在排序后的集合中,并且没有较大的元素出现在较小的元素之前。简而言之:Ruby没有Java接口的等价物。但它确实具有Java接口的等价物,并且与Java:documentation中的完全相同。此外,就像在Java中一样,验收测试也可用于指定接口。特别是在Ruby中,一个对象的接口是由它能做什么来决定的,而不是它是什么类,或者它混入了哪个模块。任何有方法的对象都可以附加。这在单元测试中非常有用,您可以简单地传入一个Array或String而不是更复杂的Logger,即使Array和Logger不共享显式接口,只是它们都有一个名为.另一个例子是StringIO,它实现了与IO相同的接口,因此实现了File的大部分接口,但除了Object之外不共享任何共同的祖先。静态类型的OO语言中经常引入接口,以弥补多重继承的不足。换句话说,它们本身就是必要的恶,而不是有用的东西。另一方面,Ruby:动态类型语言是“鸭子类型”,所以如果你想在两个对象上调用方法foo,它们既不需要继承相同的祖先类,也不需要实现相同的接口。通过mixin的概念支持多重继承,这里不需要接口。Ruby并没有它们;接口和契约通常更多地生活在静态世界而不是动态世界。如果您确实需要,可以使用一个名为Handshake的gem来实现非正式契约。Ruby使用模块的概念来替代接口(某种程度上)。Ruby中的设计模式有很多很好的例子来说明这两个概念之间的区别,以及为什么ruby??选择更灵活的接口替代方案。Jorg说得好,ruby有接口,没有关键字。在阅读一些回复时,我认为这在动态语言中是不行的。不是让编译器捕获方法未实现,而是必须创建单元测试而不是通过语言强制执行接口。它还使理解方法更难推理,因为当您尝试调用它时,您必须找出对象是什么。例如:defmy_func(options)...end如果您查看该函数,您不知道它应该选择哪些选项以及应该调用哪些方法或属性,而无需查找单元测试、在别处调用,甚至不了解如何调用。更糟糕的是,该方法甚至可能不使用这些选项,而是将它们传递给其他方法。为什么你应该在编译器捕获时编写单元测试。问题是你必须以不同的方式编写代码来表达动态语言的这个缺点。不过有一个好处,那就是动态编程语言可以快速编写一段代码。我不必编写任何接口声明,以后我可以在不访问接口的情况下用新的方法和参数公开它。权衡是维护速度。以上是C#学习教程:在Ruby中,C#中的接口相当于什么?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: