C’est du Ruby, mais j’ai eu besoin de faire un conteneur « typé », c’est à dire qui puisse dire dès l’insertion « hé, tu me donnes le mauvais truc » (mauvais truc étant, dans mon cas, la nécessité d’avoir une méthode, mais on peut imaginer d’autres trucs). Voila le code simplifié:
class TypedArray < Array
class << self
attr_accessor :method
end
def <<(item)
if !item.responds_to? self.class.method
raise "#{item} does not respond to #{self.class.method}"
end
super
end
Qui s’utilise comme ça
ArrayDelegate = Class.new TypedArray
ArrayDelegate.method = :delegate=
my_array = ArrayDelegate.new
my_array.is_a? ArrayDelegate # Et ne doit pas répondre oui pour une autre sous-classe de TypedArray, comme un ToStringArray
[^] # Re: Intéressant !
Posté par Moonz . En réponse à la dépêche CAMP 0.7.0 : bibliothèque de réflexion en C++ sous LGPL. Évalué à 2.
class TypedArray < Array
class << self
attr_accessor :method
end
def <<(item)
if !item.responds_to? self.class.method
raise "#{item} does not respond to #{self.class.method}"
end
super
end
Qui s’utilise comme ça
ArrayDelegate = Class.new TypedArray
ArrayDelegate.method = :delegate=
my_array = ArrayDelegate.new
my_array.is_a? ArrayDelegate # Et ne doit pas répondre oui pour une autre sous-classe de TypedArray, comme un ToStringArray