2011-02-22 9 views
16

Estoy tratando de entender a Ruby, y una cosa con la que estoy luchando es la falta de compatibilidad con la clase de interfaz/resumen. Desde googlear, la respuesta que veo continuamente para las preguntas abstractas relacionadas con Ruby es "Estás pensando en Java. Ruby no funciona de esa manera""Interfaces y clases abstractas innecesarias en Ruby" -> ¿Alguien puede explicar?

Entonces, ¿cómo funcionaría uno en Ruby sin interfaces/clases abstractas?

Por ejemplo, en Java podría crear un "libro" de clase abstracta, con subclases "novedoso", "libro de texto" y "diario". Hay una gran cantidad de funcionalidades comunes que incluyo en 'libro', pero no quiero que sean directamente accesibles, un libro debe ser una novela, un libro de texto o un diario.

En ruby, ¿cómo podría escribir ese tipo de funcionalidad?

+1

He aquí una pregunta similar con algunas respuestas muy bonito: http://stackoverflow.com/questions/512466/how-to-implement-an-abstract-class-in-ruby –

+0

Los espacios de nombres org.java y org.jruby funcionan muy bien juntos (: –

Respuesta

19

También soy Ruby starter. Desde mi entendimiento, hay un rival más cercano para las clases abstractas en ruby. eso es module. no puede crear ninguna instancia de módulo pero puede incluirla con otra clase. Por lo que una clase de destino obtendrá toda la funcionalidad de los padres

module Log 
    def write 
     //blah 
    end 
    end 

    class EventLog 
    include Log 

    def Prepare 
    end 
    end 

En los lenguajes de tipos estáticos como Java/C#, Interfaces cumplir las clases para tener todos los métodos en tiempo de compilación. Como Ruby es dinámico, no tiene sentido.

Para mayor claridad, comprobar estos mensajes por qué lenguajes dinámicos no requieren interfaces de ..

  1. why-dont-we-require-interfaces-in-dynamic-languages
  2. why-do-dynamic-languages-like-ruby-and-python-not-have-the-concept-of-interfaces

Saludos

+5

Estos se llaman mixins (editar: un tipo de mixin, en este caso 'include' afecta a los métodos de instancia, mientras que también puede usar' extend' que afectará a la clase métodos ... espero que lo haya explicado correctamente), si no recuerdo mal. Básicamente, el módulo proporciona funcionalidades que se pueden compartir entre varias clases, pero no es una clase en sí misma. Al hacerlo, no se puede crear una instancia de un módulo Libro, pero puede instanciar una clase de Diario que incluye el módulo Libro. – nil

+0

@nil, sí, tienes toda la razón ... Los módulos son mixins. – RameshVel

+0

Muchas gracias Ramesh. :-) – PlankTon

Cuestiones relacionadas