fletcher fletcher - 6 months ago 17
Ruby Question

In Ruby, what is the equivalent to an interface in C#?

I'm currently trying to learn Ruby and I'm trying to understand more about what it offers in terms of encapsulation and contracts.

In C# a contract can be defined using an interface. A class which implements the interface must fulfil the terms within the contract by providing an implementation for each method and property (and maybe other things) defined. The individual class that implements an interface can do whatever it needs within the scope of the methods defined by the contract, so long as it accepts the same types of arguments and returns the same type of result.

Is there a way to enforce this kind of thing in Ruby?

Thanks


A simple example of what I mean in 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();
}
}


Answer

There are no interfaces in ruby since ruby is a dynamically typed language. Interfaces are basically used to make different classes interchangeable without breaking type safety. Your code can work with every Console as long it behaves like a console which in C# means implements IConsole. "duck typing" is a keyword you can use to catch up with the dynamic languages way of dealing with this kind of problem.

Further you can and should write unit tests to verify the behavior of your code. Every object has a respond_to? method you can use in your assert.

Comments