Учитывая следующий интерфейс в модуле:
module Action
abstract def perform
end
Я хотел бы использовать его для создания экземпляров различных классов, которые его реализуют:
class Run
include Action
def perform
puts "run!"
end
end
class Jump
include Action
def perform
puts "jump!"
end
end
Я знаю, что можно определить массив типа [] of Action
и иметь возможность хранить экземпляры Action
, но меня интересуют классы, а не экземпляры.
Я хотел бы знать, как определить ограничение типа, чтобы я мог сохранить ссылку на класс, реализующий интерфейс, а не на конкретный экземпляр.
Моя цель - создать новый экземпляр определенного класса и вызвать в нем метод perform
.
На данный момент можно написать следующий код:
actions = [Run, Jump]
actions.each do |klass|
instance = klass.new.as(Action)
instance.perform
end
И все будет работать, однако будет невозможно сохранить этот список классов в переменной экземпляра, поскольку ограничения типов немного более строгие.
Каким будет синтаксис ограничения типа в этом случае?