Как насчет постепенное исчезновение () функция. Выглядел бы примерно так:
$("#myDiv").fadeOut(5000);
Если я создам фабричный метод, который не вызывается 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 в комментариях.
Адаптировано из здесь , у меня есть
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
А как насчет включенного модуля вместо суперкласса? Таким образом, вы по-прежнему получаете #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
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 ).
Вы можете немного поправить ситуацию, изменив 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>