Книга: Программирование на языке 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)
Таким образом, можно определить любое число методов, создающих объекты по различным спецификациям. Вопрос о том, уместен ли здесь термин «конструктор», мы оставим «языковым адвокатам».
- 11.1.1. Применение нескольких конструкторов
- 11.1.2. Создание атрибутов экземпляра
- 11.1.3. Более сложные конструкторы
- 11.1.4. Создание атрибутов и методов уровня класса
- 11.1.5. Наследование суперклассу
- 11.1.6. Опрос класса объекта
- 11.1.7. Проверка объектов на равенство
- 11.1.8. Управление доступом к методам
- 11.1.9. Копирование объектов
- 11.1.10. Метод initialize_copy
- 11.1.11. Метод allocate
- 11.1.12. Модули
- 11.1.13. Трансформация или преобразование объектов
- 11.1.14. Классы, содержащие только данные (Struct)
- 11.1.15. Замораживание объектов
- Одновременный запуск нескольких копий сервера (multi-instancing)
- 3.5 Проблемы доступа при использовании нескольких протоколов
- Перегрузка конструкторов
- Я работаю на компьютере не один. Как настроить Windows для нескольких пользователей?
- Применение функции scanf( )
- Применение PHP-технологий в программе HtmlPad
- 17.6 Применение агентов новостей для настольных систем
- 2.3. Эмпирическая модель обучения Дэвида Колба и ее применение в практике бизнес-тренинга
- Применение основного потока
- Применение пользовательских атрибутов
- Применение peristaltic.py к арматуре
- Построение диаграммы на основе данных нескольких рабочих листов