Dagi3d v4

Clases abstractas en ruby

Mientras seguía trasteando con ruby me percaté de que no existen determinadas características de la programación orientada a objetos que sí ofrece Java como son las clases abstractas. Así que como siempre, para seguir aprendiendo me puse a picar un poco de código para poder utilizar dicha funcionalidad en mis clases.

Como quería poder definir cualquier clase como abstracta de manera más o menos transparente, lo único que tenía que hacer era añadir un poco de código extra a la clase Class que aportase las siguientes funciones:
- Poder marcar una clase como abstracta.
- Poder definir dentro de la clase qué métodos serán abstractos.
- Lanzar una excepción en caso de instanciar una clase abstracta.
- Lanzar una excepción si se implementó un método abstracto dentro de la clase abstracta.
- Lanzar una excepción si no se implementaron los métodos abstractos heredados de la clase abstracta.

Y esta es la solución a la que llegúe: http://svn.dagi3d.net/rails/abstract_class/trunk/lib/abstract_class.rb

Para marcar una clase como abstracta, basta con llamar al método abstract_class y para definir un método como abstracto, a abstract_method :método:

class Foo
abstract_class
abstract_method :foo
end

# clase concreta
class Bar < Foo
def foo
end
end

Por si a alguien le interesa, el código está disponible en un repositorio de subversion en http://svn.dagi3d.net/rails/abstract_class/trunk/ y una gema ya preparada para instalar en http://dagi3d.net/temp/abstract_class-0.1.0.gem

osoh
09/01/2007 19:12

No acabo de ver clara la necesidad de tener clases abstractas en Ruby. Échale un vistazo a este hilo de ruby-talk: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/139545

Un saludo.

dagi3d
09/01/2007 23:43

Está claro que si el señor Matz no añadió las clases abstractas, es porque no lo consideró necesario y hojeando el enlace que has puesto parece que la alternativa es que lo han denominado como ‘duck typing’. Supongo que al fin y al cabo, son distintas formas de pensar para acabar realizando lo mismo.

De todas maneras tampoco pretendía que fuese algo que terminase de tener un sentido del todo funcional(de hecho ni me molesté en mirar a ver si alguien ya se había planetado este ‘problema’, cuando era obvio que sí), ya que lo que pretendía era seguir practicando con ruby y con todo el rollo de la metaprogramación, que me parece que se pueden hacer auténticas virguerías. face-smile.png

un saludo!

Deja un comentario
*: campos obligatorios. La dirección de correo no será publicada