Методы фабрики в Ruby

Как насчет постепенное исчезновение () функция. Выглядел бы примерно так:

$("#myDiv").fadeOut(5000);

18
задан Peter 4 October 2009 в 04:17
поделиться

5 ответов

Если я создам фабричный метод, который не вызывается 1 new ] или initialize , я думаю, это не совсем отвечает на вопрос «как мне создать ... конструктор ...», но я думаю, что я бы сделал это так ...

class Vehicle
  def Vehicle.factory vt
    { :Bike => Bike, :Car => Car }[vt].new
  end
end

class Bike < Vehicle
end

class Car < Vehicle
end

c = Vehicle.factory :Car
c.class.factory :Bike

1. Вызов метода factory очень хорошо работает в этом учебном примере, но вы можете рассмотреть совет @AlexChaffee в комментариях.

20
ответ дан 30 November 2019 в 06:26
поделиться

Адаптировано из здесь , у меня есть

class Vehicle
  def self.new(model_name)
    if model_name == 'mountain bike'  # etc.
      object = Bike.allocate
    else
      object = Car.allocate
    end
    object.send :initialize, model_name
    object
  end
end

class Bike < Vehicle
  def initialize(model_name)
  end
end

class Car < Vehicle
  def initialize(model_name)
  end
end
6
ответ дан 30 November 2019 в 06:26
поделиться

А как насчет включенного модуля вместо суперкласса? Таким образом, вы по-прежнему получаете #kind_of? для работы, и никакие стандартные новые не будут мешать.

module Vehicle
  def self.new(name)
    when 'mountain bike'
      Bike.new(name)
    when 'Ferrari'
      Car.new(name)
    ...
    end
  end
end

class Bike
  include Vehicle
end

class Car
  include Vehicle
end
4
ответ дан 30 November 2019 в 06:26
поделиться
class VehicleFactory
  def new() 
    if (wife_allows?)
       return Motorcycle.new
    else
       return Bicycle.new
    end
  end
end

class vehicleUser 
  def doSomething(factory)
    a_vehicle = factory.new()
  end
end

и теперь мы можем сделать ...

client.doSomething(Factory.new)
client.doSomething(Bicycle)    
client.doSomething(Motorcycle)

Вы можете увидеть этот пример в книге Шаблоны проектирования в Ruby ( Ссылка на Amazon ).

2
ответ дан 30 November 2019 в 06:26
поделиться

Вы можете немного поправить ситуацию, изменив Vehicle # new на:

class Vehicle
  def self.new(model_name = nil)
    klass = case model_name
      when 'mountain bike' then Bike
      # and so on
      else                      Car
    end
    klass == self ? super() : klass.new(model_name)
  end
end

class Bike < Vehicle
  def self.new(model_name)
    puts "New Bike: #{model_name}"
    super
  end
end

class Car < Vehicle
  def self.new(model_name)
    puts "New Car: #{model_name || 'unknown'}"
    super
  end
end

Последняя строка Vehicle.new с тройным оператором. является важным. Без проверки klass == self мы застреваем в бесконечном цикле и генерируем StackError, на который ранее указывали другие. Обратите внимание, что мы должны называть super в круглых скобках. В противном случае мы бы вызывали его с аргументами, которых super не ожидает.

И вот результаты:

> Vehicle.new
New Car: unknown # from puts
# => #<Car:0x0000010106a480>

> Vehicle.new('mountain bike')
New Bike: mountain bike # from puts
# => #<Bike:0x00000101064300>

> Vehicle.new('ferrari')
New Car: ferrari # from puts
# => #<Car:0x00000101060688>
1
ответ дан 30 November 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: