fle*_*her 21 c# ruby interface contract equivalent
我目前正在尝试学习Ruby,并且我正在尝试更多地了解它在封装和合同方面提供的内容.
在C#中,可以使用接口定义合同.实现接口的类必须通过为每个定义的方法和属性(以及可能的其他内容)提供实现来满足合同中的条款.实现接口的单个类可以在合同定义的方法范围内执行任何需要,只要它接受相同类型的参数并返回相同类型的结果.
有没有办法在Ruby中强制执行此类操作?
谢谢
我在C#中的一个简单例子:
Run Code Online (Sandbox Code Playgroud)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(); } }
Zeb*_*ebi 25
ruby中没有接口,因为ruby是一种动态类型语言.接口基本上用于使不同的类可互换而不会破坏类型安全性.您的代码可以与每个控制台一起使用,只要它像C#中的控制台一样实现IConsole."duck typing"是一个关键字,你可以用它来赶上处理这类问题的动态语言方式.
此外,您可以并且应该编写单元测试来验证代码的行为.每个对象都有一个respond_to?可以在断言中使用的方法.
Jör*_*tag 15
Ruby拥有接口,就像任何其他语言一样.
请注意,您必须小心不要混淆Interface的概念,这是一个单元的职责,保证和协议的抽象规范,其概念interface是Java,C#和VB.NET编程中的关键字.语言.在Ruby中,我们一直使用前者,但后者根本不存在.
区分这两者非常重要.重要的是界面,而不是interface.该interface告诉你几乎没有什么用处.没有什么比Java中的标记接口更好地证明了这一点,它们是完全没有成员的接口:只需看看java.io.Serializable和java.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.
接口通常被引入静态类型的OO语言,以弥补多重继承的缺失.换句话说,他们更的必要之恶比一些有用的东西本身每.
另一方面,Ruby:
foo在两个对象上调用方法,它们既不需要继承相同的祖先类,也不需要实现相同的接口.| 归档时间: |
|
| 查看次数: |
6233 次 |
| 最近记录: |