den folgenden Schnittstelle in einem Modul Gegeben:Wie kann ein Typ auf die Klasse einer Schnittstelle und nicht auf die Instanz dieser Schnittstelle beschränkt werden?
module Action
abstract def perform
end
Ich mag es verwenden, um verschiedene Klassen zu instanziiert, die sie implementieren:
class Run
include Action
def perform
puts "run!"
end
end
class Jump
include Action
def perform
puts "jump!"
end
end
ich weiß, sind möglich, ein Array wie [] of Action
zu definieren und in der Lage sein, Instanzen von Action
zu speichern, aber ich interessiere mich für die Klassen anstelle der Instanzen.
Ich würde gerne wissen, wie die Typeinschränkung zu definieren, so dass ich einen Verweis auf die Klasse speichern kann, die die Schnittstelle und nicht eine bestimmte Instanz implementiert.
Mein Ziel ist in der Lage, eine neue Instanz einer bestimmten Klasse instanziieren und in der Lage sein, die perform
Methode aufzurufen.
Zu diesem Zeitpunkt ist es möglich, den folgenden Code zu schreiben:
actions = [Run, Jump]
actions.each do |klass|
instance = klass.new.as(Action)
instance.perform
end
Und die Dinge funktionieren wird, aber es wird nicht möglich sein, dass die Liste der Klassen in eine Instanzvariable zu speichern, da die Typeinschränkungen a sind etwas strenger.
Was wäre die Typeinschränkungssyntax für diesen Fall?
Was ist der Grund, jedes Mal eine neue Instanz zu instanziieren, anstatt die gleiche Instanz zu verwenden? – asterite
@asterite Ein Dev könnte die Instanzvariablen in der Funktion ändern. Wenn dies über mehrere Fasern/Threads hinweg aufgerufen wird, kann dies zu Problemen führen. AFAIK eine neue Instanz ist das beste Szenario. –