2009-02-22 15 views
20

Según tengo entendido, una interfaz de Java está destinada a imponer un diseño al diseñar métodos para que las clases que implementan la interfaz rellenen. ¿Es esta la idea con un módulo de Ruby también? Veo que al igual que con Interfaces en Java, no puedes instanciar un módulo en Ruby.¿Es un módulo Ruby equivalente a una interfaz Java?

Respuesta

7

Creo que igualaría un módulo a algo más parecido a un método de extensión en C#. Está agregando funcionalidad a una clase existente que en realidad está definida en otro lugar. No existe un análogo exacto ni en C# ni en Java, pero definitivamente no lo consideraría una interfaz porque se deriva tanto la implementación como la interfaz.

+0

Para mi propio beneficio aquí, ¿me equivoco en mi evaluación? Así es como los he estado usando hasta ahora, tal vez me estoy perdiendo algo. –

+0

Puede incluir un módulo en una clase Ruby y heredar su comportamiento, al menos los métodos de instancia. Eche un vistazo a http://www.ruby-doc.org/core/classes/Module.html – tvanfosson

+0

Es cierto, lo sabía, rara vez lo uso en el fabricante de rpg. Gracias, veo el punto ahora. –

3

No. Un módulo en ruby ​​es más parecido a una clase estática. No soy un desarrollador de Java, pero estoy adivinando que las interfaces Java son similares a las interfaces C#, es decir, definen un contrato, pero no una implementación.

No debería, aunque tengo experiencia en ruby, es en la creación de videojuegos (RGSS/2). Estoy seguro de que ignoro muchas cosas que un veterano programador de rubíes sabría.

+0

así que si un 'ruby'' module' es como 'Java'' static class', entonces ¿es un 'ruby'' module' como 'C#' 'namespace'? – mmcrae

3

Un módulo en ruby ​​es un poco de alcance/espacio de nombres que se puede agregar a otras cosas. Se usan con dos propósitos distintos pero relacionados: agrupar un montón de cosas relacionadas (constantes, clases, etc.) que pertenecen juntas y luego agregarlas a algún otro ámbito (como la herencia múltiple).

Por ejemplo, hay módulos denominados como Comparable y Enumerable, entre otros, que encapsulan la funcionalidad que esperaría que tuviera algo si se aplicaran estos adjetivos. Al proporcionar una definición básica (un método que compara dos instancias para Comparable y un iterador para Enumerable) puede importar el módulo y encontrarse con la interfaz completa.

Por otro lado, hay módulos como Net que raramente incluiría en una clase pero que proporcionan un conjunto de funcionalidades tales como Net :: HTTP, Net :: FTP, Net :: SMTP, y así sucesivamente.

En el medio hay cosas como Matemáticas y Proceso que pueden usarse de una forma u otra.

- MarkusQ

17

La respuesta corta es no.

Aquí está el razonamiento, una interfaz Java/C# define las firmas de métodos que una clase de implementación proporcionará como mínimo.

Además:

  • Con los módulos de rubí no existe tal contrato debido a la pato-escribir.
  • Los módulos son solo una forma de extraer la funcionalidad común para una fácil reutilización. La relación más cercana son los métodos de extensión C#, pero esos no son una coincidencia exacta ya que existen en un contexto estático.
  • Los módulos pueden agregar estado a una clase existente.
  • Los módulos pueden tener métodos estáticos
  • Los módulos pueden actuar como espacios de nombres

Ejemplo:

module SimpleConversation 
    class NamespacedExample 
    def poke 
     puts "ouch" 
    end 
    end 

    attr_accessor :partner_name 
    def converse 
    partner_name ||= "Slowpoke" 
    speak + "\n#{partner_name}: Yes they are" 
    end 

    def self.yay 
    puts "yay" 
    end 
end 

class Foo 
    include SimpleConversation 
    attr_accessor :name 

    def speak 
    name ||= "Speedy" 
    "#{name}: tacos are yummy" 
    end 
end 

x = Foo.new 
x.name = "Joe" 
x.partner_name = "Max" 
puts x.speak 
puts x.converse 

y = SimpleConversation::NamespacedExample.new 
y.poke 

SimpleConversation.yay 
Cuestiones relacionadas