Problème d'héritage multiple

Problème d'héritage multiple - Ruby/Rails - Programmation

Marsh Posté le 04-09-2007 à 13:37:59    

Bonjour,
 
J'ai une classe Element, qui serait une classe abstraite en java.
Elle contient des méthodes génériques (ajout, suppression, édition ,... ) et a des classes filles (Utilisateur par exemple).
Je voudrais que toutes les classes filles héritent de ActiveRecord::base pour pouvoir bénéficier des mécanismes de rails, mais j'aimerais en même temps pouvoir utiliser les méthodes de la classe mère de manière générique. À ce que j'ai compris, Element ne peut pas hériter d' ActiveRecord::base car il n'y a pas de table elements. J'ai donc pensé utiliser le "mixin" de ruby en créant un module Element (bien que ça me semble pas top car on perd un peu la notion d'héritage).
Problème :
Comment faire pour utiliser le polymorphisme (par exemple Element.find(:all) pour récupérer tous les elements de la table) alors que Element ne derive pas d'active record?
 
Merci d'avance


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 04-09-2007 à 13:37:59   

Reply

Marsh Posté le 07-09-2007 à 10:12:22    

J'ai rien compris.

 

En gros, tu as un mixin Element, tu as des classes que tu vas faire hériter d'ActiveRecord::Base et dans lesquelles tu vas mixer Element, et tu voudrais savoir comment -- dans les méthodes définies dans Element, et qui seront donc après mixage accessibles dans tes classes -- utiliser les méthodes d'AR::Base genre #find?

 

Ben tu le fais, tout simplement. Je rappelle que Ruby c'est du late binding toussa, donc la résolution des noms et des méthodes se fait au moment de leur appel et pas avant:

 
Code :
  1. #element.rb
  2. module Element
  3.  def mixed_in
  4.    self.foo
  5.  end
  6. end


Code :
  1. #test.rb
  2. require 'element'
  3.  
  4. class Foo
  5.  def foo
  6.    "This will appear in Baz"
  7.  end
  8. end
  9.  
  10. class Bar < Foo
  11.  def mixed_in
  12.    "no mixin in Bar"
  13.  end
  14. end
  15.  
  16. class Baz < Foo
  17.  include Element
  18. end
  19.  
  20. class Buzz < Foo
  21.  include Element
  22.  def foo
  23.    "redefined foo in Buzz"
  24.  end
  25. end
  26.  
  27. puts "Bar: ", Bar.new.mixed_in
  28. puts "Baz: ", Baz.new.mixed_in
  29. puts "Buzz: ", Buzz.new.mixed_in


$ ruby test.rb
Bar:
no mixin in Bar
Baz:
This will appear in Baz
Buzz:
redefined foo in Buzz
$


La classe Foo correspond à ActiveRecord::Base (j'aurais pu la mettre dans un autre fichier, mais ça n'aurait rien changé), le module Element correspond à ton mixin, et les classes Bar, Baz et Buzz correspondent aux classes que tu vas dériver de Foo.

 

edit: et accessoirement, Element ne correspondrait absolument pas à une classe abstraite java, il n'y a pas moyen d'exprimer facilement un héritage de comportement en java, tu serais obligé de créer une interface soir pour Element soit pour AR:Base et tu aurais à réimplémenter tout le comportement de l'un des deux.


Message édité par masklinn le 07-09-2007 à 10:16:07

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-09-2007 à 13:33:58    

Ok merci beaucoup :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed