Книга: Программирование на языке Ruby

11.1.1. Применение нескольких конструкторов

11.1.1. Применение нескольких конструкторов

В Ruby нет «настоящих» конструкторов, как в C++ или в Java. Сама идея, конечно, никуда не делась, поскольку объекты необходимо создавать и инициализировать, но реализация выглядит иначе.

В Ruby каждый класс имеет метод класса new, который вызывается для создания новых объектов. Метод new вызывает специальный определяемый пользователем метод initialize, который инициализирует атрибуты объекта, после чего new возвращает ссылку на новый объект.

А если мы хотим иметь несколько конструкторов? Как быть в этом случае?

Ничто не мешает завести дополнительные методы класса, которые возвращают новые объекты. В листинге 11.1 приведен искусственный пример класса для представления прямоугольника, у которого есть две длины сторон и три значения цвета. Мы создали дополнительные методы класса, предполагающие определенные умолчания для каждого параметра. (Например, квадрат — это прямоугольник, у которого все стороны равны.)

Листинг 11.1. Несколько конструкторов

class ColoredRectangle
 def initialize(r, g, b, s1, s2)
  @r, @g, @b, @s1, @s2 = r, g, b, s1, s2
 end
 def ColoredRectangle.white_rect(s1, s2)
  new(0xff, 0xff, 0xff, s1, s2)
 end
 def ColoredRectangle.gray_rect(s1, s2)
  new(0x88, 0x88, 0x88, s1, s2)
 end
 def ColoredRectangle.colored_square(r, g, b, s)
  new(r, g, b, s, s)
 end
 def ColoredRectangle.red_square(s)
  new(0xff, 0, 0, s, s)
 end
 def inspect
  "#@r #@g #@b #@s1 #@s2"
 end
end
a = ColoredRectangle.new(0x88, 0xaa, 0xff, 20, 30)
b = ColoredRectangle.white_rect(15,25)
с = ColoredRectangle.red_square(40)

Таким образом, можно определить любое число методов, создающих объекты по различным спецификациям. Вопрос о том, уместен ли здесь термин «конструктор», мы оставим «языковым адвокатам».

Оглавление книги


Генерация: 1.136. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз