Ответ Томалака подходит для ColdFusion 8; однако ситуация немного меняется с ColdFusion 9, который должен выйти в конце этого года. (Для полноты картины, я буду копировать в ответ Томалак и корректировать по мере необходимости, так что спасибо за фору. :))
Должен ли я использовать имя инициализации, как имя конструктора ?
CF8: Нет, вы можете назвать функцию инициализации все, что угодно - «INIT» это всего лишь условность. И это не истинный конструктор, поскольку он не называется автоматически.
CF9: Ответ до сих пор «нет», вы не должны . Но вам может потребоваться: Это относится к созданию объектов внутри cfscript (или только для скриптовых компонентов, которые также входят в CF9). В import
и new
ключевые слова будут добавлены, и вы будете иметь возможность создать экземпляр объекта, как так:
import model.security.*;
userObj = new User();
Это предполагает, что у вас есть User.cfc
внутри папки model/security/
. Кроме того, CF9 будет искать существование либо метода с именем «init», либо одного с тем же именем, что и объект («Пользователь» в этом случае), и неявным образом называть это конструктором.
Я не уверен, что передача аргументов в директиву new
передаст их конструктору, как вы видели на Java/C. Я предполагаю, что это произойдет, но я не видел никаких презентаций или примеров кода, которые указывают так или иначе; и не испытал его сам, потому что это просто пришло мне во время написания этого. ;) (Другая идея: мне интересно, поддерживаются ли несколько конструкторов с разными наборами аргументов. Я сомневаюсь, но это сообразительная идея.)
Я предполагаю, что есть некоторые предпосылки, что подобная функциональность может отображаться в CFML (язык на основе тегов, отдельно от cfscript), но об этом в этот момент ничего не сказано.
Если я создаю экземпляр компонента без вызова метода инициализации, что возвращается?
Экземпляр компонента возвращается, как и следовало ожидать. Наличие или отсутствие функции init() совершенно не имеет значения. В компонентах ColdFusion нет понятия статических функций, вы всегда получаете полностью сконструированный экземпляр из GetObject («компонент», ...). (Не так для Java объектов, которые строятся как раз перед первым использованием, если вы забыли/не делать это вручную.)
Могу ли я взять код в методе инициализации и удалять метод инициализации , затем вставьте код в голову компонента, имеет ли он тот же эффект, что и конструктор init?
Да, до тех пор как метод инициализации() не принимает никаких параметров, нет никакой разницы.
Однако это соглашение имеет метод init(), который возвращает экземпляр компонента («this»). Даже если он ничего не делает кроме «return this;
». Я остался бы последовательным и добавлял бы один к каждому компоненту, даже если это было не обязательно.
хороший ответ !! большое спасибо Tomalak !! – user133580
Не могу ответить им лучше. :) – Henry
Просто хочу добавить, что условное обозначение «init», возможно, произошло из CreateObject («java», ...) использует .init() для вызова конструктора класса java. http://www.cfquickdocs.com/cf8/#CreateObject.java «Используйте метод инициализации, с соответствующими аргументами, чтобы вызвать экземпляр класса. Например: « –
Henry