11.1.3. Более сложные конструкторы

11.1.3. Более сложные конструкторы

По мере усложнения объектов у них появляется все больше атрибутов, которые необходимо инициализировать в момент создания. Соответствующий конструктор может оказаться длинным и запутанным, его параметры даже не будут помещаться на одной строке.

Чтобы справиться со сложностью, можно передать методу initialize блок (листинг 11.2). Тогда инициализация объекта выполняется в процессе вычисления этого блока. Хитрость в том, что вместо обычного eval для вычисления блока в контексте объекта, а не вызывающей программы, следует использовать метод instance_eval.

Листинг 11.2. «Хитрый» конструктор

class PersonalComputer

 attr_accessor :manufacturer,

  :model, :processor, :clock,

  :ram, :disk, :monitor,

  :colors, :vres, :hres, :net

 def initialize(&block)

  instance_eval &block

 end

 # Прочие методы...

end

desktop = PersonalComputer.new do

 self.manufacturer = "Acme"

 self.model = "THX-1138"

 self.processor = "986"

 self.clock = 9.6  # ГГц

 self.ram =16      # Гб

 self.disk =20     # T6

 self.monitor = 25 # дюймы

 self.colors = 16777216

 self.vres = 1280

 self.hres = 1600

 self.net = "T3"

end

p desktop

Отметим несколько нюансов. Во-первых, мы пользуемся методами доступа к атрибутам, поэтому присваивание им значений интуитивно понятно. Во-вторых, ссылка на self необходима, поскольку метод установки требует явного указания вызывающего объекта, чтобы можно было отличить вызов метода от обычного присваивания локальной переменной. Конечно, можно было не определять методы доступа, а воспользоваться функциями установки.

Ясно, что в теле блока можно делать все, что угодно. Например, можно было бы вычислить некоторые поля на основе других.

А если вам не нужны методы доступа для всех атрибутов? Если хотите, можете избавиться от лишних, вызвав для них метод undef в конце конструирующего блока. Как минимум, это предотвратит «случайное» присваивание значения атрибуту извне объекта.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

1.10 Конструкторы

Из книги C++ автора Хилл Мюррей

1.10 Конструкторы Определение ostream как класса сделало члены данные зарытыми. Только функция член имеет доступ к закрытым членам, поэтому надо предусмотреть функцию для инициализации. Такая функция называется конструктором и отличается тем, что имеет то же имя, что и ее


5.5 Конструкторы и Деструкторы

Из книги Музыкальный центр на компьютере автора Леонтьев Виталий Петрович

5.5 Конструкторы и Деструкторы Если у класса есть конструктор, то он вызывается всегда, когда создается объект класса. Если у класса есть деструктор, то он вызывается всегда, когда объект класса уничтожается. Объекты могут создаваться как:1. Автоматический объект:


6.3.1 Конструкторы

Из книги Программирование на языке Пролог автора Клоксин У.

6.3.1 Конструкторы Альтернативу использованию нескольких функций (перегрженных) составляет описание конструктора, который по заданнму double создает complex. Например:class complex (* // ... complex(double r) (* re=r; im=0; *) *);Конструктор, требующий только один параметр, необязтельно вызывать


8.5.5 Конструкторы

Из книги Справочное руководство по C++ автора Страустрап Бьярн

8.5.5 Конструкторы Функция член с именем, совпадающим с именем ее класса, называется конструктором. Если класс имеет конструктор, то он вызывается для каждого объекта этого класса перед тем, как этот объект будет калибо использован, см. #8.6.Конструктор не может быть virtual или


Конструкторы

Из книги 300 лучших программ на все случаи жизни автора Леонтьев Виталий Петрович

Конструкторы Mediachance Multimedia Builder MP3 Сайт: http://www.mmbgroup.comРазмер: 20 МбСтатус: SharewareЦена: $60Все мы в детстве играли в конструкторы – от простых кубиков до груды железяк под названием «Школьный конструктор N1». В эпоху компьютеров конструкторы никуда не делись (ведь компьютер и сам


R.12.1 Конструкторы

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

R.12.1 Конструкторы Конструктором называется функция-член, имя которой совпадает с именем класса, он используется для построения значений, имеющих тип данного класса. Если в классе есть конструктор, то каждый объект этого класса перед произвольным использованием будет


Конструкторы

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Конструкторы Mediachance Multimedia Builder MP3Сайт: http://www.mmbgroup.comРазмер: 20 МбСтатус: SharewareЦена: $60Все мы в детстве играли в конструкторы – от простых кубиков до груды железяк под названием «Школьный конструктор № 1». В эпоху компьютеров конструкторы никуда не делись (ведь компьютер и


2.7. Более сложные сценарии

Из книги автора

2.7. Более сложные сценарии Смысл празднования дня рождения ребенка весьма приближенно передается тем определением, которое можно найти, например, в толковом словаре: день рождения — это «прием гостей, устраиваемый по случаю дня рождения». Прием здесь может, в свою


Глава 9. Более сложные структуры данных

Из книги автора

Глава 9. Более сложные структуры данных Графическое представление данных абстрагирует банки памяти любого компьютера. Невообразимая сложность. Лучи света, протянувшиеся в не-пространстве разума, скопления и созвездия данных. Как гаснущие огни большого города. Вильям


11.2. Более сложные механизмы

Из книги автора

11.2. Более сложные механизмы Не все в модели ООП, реализованной в Ruby, одинаково очевидно. Что-то сложнее, что-то применяется реже. Линия раздела для каждого программиста проходит в разных местах. В этой части главы мы попытались собрать те средства, которые не так просты или


Более сложные трансформации

Из книги автора

Более сложные трансформации От простого — к сложному. Это вечный путь познания. Последуем им и мы.Сложные трансформации графики (вращение, сдвиг, изменение размеров и пр.) выполняются во Flash 8 с помощью особого инструмента, называемого Free Transform (Трансформатор). Чтобы


Более сложные эффекты

Из книги автора

Более сложные эффекты Закончив с эффектами простейшими, перейдем к более сложным и более, если так можно сказать, эффектным. Их побольше — целых