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)
Таким образом, можно определить любое число методов, создающих объекты по различным спецификациям. Вопрос о том, уместен ли здесь термин «конструктор», мы оставим «языковым адвокатам».
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Переход нескольких свойств
Переход нескольких свойств Предположим, что кроме цвета фона хочется также менять цвет самой ссылки и накладывать переход на это изменение. Такого эффекта можно достичь, перечисляя одновременно несколько переходов и разделяя их запятой. На каждый переход можно
Применение нескольких эффектов
Применение нескольких эффектов К одному и тому же изображению можно применить сразу несколько эффектов. Это можно сделать, не закрывая окно галереи фильтров. Обратите внимание на список, расположенный в правой нижней части окна. Там указан фильтр, который в данный момент
8.3. Использование конструкторов и деструкторов для управления ресурсами (RAII)
8.3. Использование конструкторов и деструкторов для управления ресурсами (RAII) ПроблемаДля класса, представляющего некоторый ресурс, требуется использовать конструктор для получения этого ресурса и деструктор для его освобождения. Эта методика часто называется
Шаг 20 - Временные объекты. Неявные вызовы конструкторов и их подавление.
Шаг 20 - Временные объекты. Неявные вызовы конструкторов и их подавление. Не удается углубиться в какую-либо тему. Приходится касаться по верхам, потом переключаться на что-то другое. С другой стороны, может это и правильно, часто достаточно только знать, что есть ТАКОЕ
Роль конструкторов
Роль конструкторов До сих пор объекты HelloClass строились с помощью конструктора, заданного по умолчанию, который, по определению, не имеет аргументов. Каждый класс C# автоматически снабжается типовым конструктором, который вы можете при необходимости переопределить. Этот
Определение конструкторов типов
Определение конструкторов типов Система CTS (общая система типов) поддерживает конструкторы как уровня экземпляра, так и уровня класса (статические конструкторы). В терминах CIL для конструкторов уровня экземпляра используется лексема .ctor, а для статических конструкторов
18.5.3. Порядок вызова конструкторов и деструкторов
18.5.3. Порядок вызова конструкторов и деструкторов Виртуальные базовые классы всегда конструируются перед невиртуальными, вне зависимости от их расположения в иерархии наследования. Например, в приведенной иерархии у класса TeddyBear (плюшевый мишка) есть два виртуальных
Индексы для нескольких столбцов
Индексы для нескольких столбцов Если вашим приложениям часто требуется поиск, упорядочение или группировка по некоторой группе из нескольких столбцов в конкретной таблице, будет полезно создать индекс для нескольких столбцов (также называемый составным или
Транзакции для нескольких баз данных
Транзакции для нескольких баз данных Firebird поддерживает операции над несколькими базами данных под управлением одной транзакции. Он автоматически реализует двухфазное подтверждение (Two- Phase Commit, 2РС), чтобы гарантировать, что транзакция не подтвердит работу в одной базе
Совместимость нескольких серверов
Совместимость нескольких серверов Любое количество приложений встроенного сервера может выполняться одновременно без каких бы то ни было конфликтов. Однако невозможно нескольким встроенным серверам иметь одновременный доступ к одной базе данных по причине
Создание нескольких меню
Создание нескольких меню Pinnacle Studio Plus поддерживает создание нескольких меню в одном проекте. Это дает возможность создавать иерархическое меню, на примере которого мы и рассмотрим работу с проектами, содержащими несколько DVD-меню. Особенным в создании иерархического
18.3.17. Применение нескольких операторов if
18.3.17. Применение нескольких операторов if Операторы if можно вкладывать; при этом нужно следить, чтобы каждому ключевому слову if соответствовало слово
Наследование конструкторов
Наследование конструкторов Правила наследования конструкторов - достаточно сложные. В разных языках программирования приняты разные решения на этот счет. В частности, в Delphi Object Pascal все конструкторы наследуются. В .NET, напротив, конструкторы не наследуются. Причина такого
Реализация нескольких интерфейсов
Реализация нескольких интерфейсов Несколько интерфейсов могут содержать одинаковые методы или свойства. При наследовании от таких интерфейсов такие одинаковые методы или свойства сливаются в один: type IShape = interface procedure Draw; property X: integer read; property Y: integer read; end; IBrush =