2009-07-10 5 views
6

у меня есть несколько вопросов о конструкторах в ColdFusion:вопрос о ColdFusion имени компонента конструктора

  1. я должен использовать имя init как имя конструктора?
  2. если я создаю экземпляр компонента без вызова метода init, что возвращается?

    instance = createObject ("component", "cfcName"); // какое значение теперь имеет место удержание

  3. Могу ли я взять код в методе init и удалить метод init, а затем вставить код в головку компонента, имеет ли он тот же эффект, что и конструктор init ?

большое спасибо.

ответ

14

Должен ли я использовать имя init в качестве имени конструктора?

Нет, вы можете назвать функцию инициализации любым способом. init() - просто конвенция. И это не настоящий конструктор, поскольку он не вызывается автоматически.

если я создаю экземпляр компонента без вызова метода init, что возвращается?

Экземпляр компонента возвращается, как и следовало ожидать. Наличие или отсутствие функции init() совершенно не имеет значения. В компонентах ColdFusion нет понятия статических функций, вы всегда получаете полностью сконструированный экземпляр от GetObject("component", ...). (Не так для объектов Java, которые создаются непосредственно перед первым использованием, если вы забыли/не сделали это вручную.)

Могу ли я взять код в методе init и удалить метод init, затем вставьте код в голову компонента, имеет ли он тот же эффект, что и конструктор init?

Да, до тех пор, пока метод init() не принимал никаких параметров, нет никакой разницы.

Однако это соглашение имеет метод, называемый init(), который возвращает экземпляр компонента. Даже если это ничего кроме «<cfreturn this>». Я остался бы последовательным и добавлял бы один к каждому компоненту, даже если это было не обязательно.

+1

хороший ответ !! большое спасибо Tomalak !! – user133580

+0

Не могу ответить им лучше. :) – Henry

+2

Просто хочу добавить, что условное обозначение «init», возможно, произошло из CreateObject («java», ...) использует .init() для вызова конструктора класса java. http://www.cfquickdocs.com/cf8/#CreateObject.java «Используйте метод инициализации, с соответствующими аргументами, чтобы вызвать экземпляр класса. Например: « – Henry

10

Ответ Томалака подходит для 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;». Я остался бы последовательным и добавлял бы один к каждому компоненту, даже если это было не обязательно.

+0

+1 для дополнений CF9, очень интересно. Мы все еще на CF7 здесь, но если CF9 действительно выйдет в ближайшее время (я не отслеживал график выпуска), то, я думаю, мы вообще пропускаем CF8. – Tomalak

+0

До сих пор нам сообщалось, что он будет выпущен в 2009 году. Он просто вышел на публичную бета-версию с полуночи + 1 секунду этим утром (http://labs.adobe.com/technologies/coldfusion9/) с ColdFusion Builder, новой официальной IDE (http://labs.adobe.com/technologies/coldfusionbuilder/). –

1

Некоторые сторонние библиотеки/рамки могут ожидать, что init будет функцией-конструктором (очевидно, pre-CF9).Например, я считаю, что ColdSpring ищет метод под названием init при попытке передать аргументы конструктора.

В ответ на ответ Адама, я уверен, что несколько конструкторов не будут частью CF9, так как для этого потребуется перегрузка метода, о которой я ничего не слышал. Обычным обходным решением является использование Duck typing и проверка аргументов для типа и предоставление необязательных аргументов (способность передавать именованные аргументы делает это довольно легко обрабатывать).

Ссылка на презентацию Шона Corfield на Duck Typing: http://corfield.org/articles/ducktyping_cfunited.pdf

+0

Да, ColdSpring требует, чтобы конструктор назывался Init. Утиная печать не требуется для различных вариантов инициализации - просто используйте необязательные параметры и передавайте их по имени (или с помощью коллекции аргументов). Это был просто рифф. :) –

+0

Да, это подход, который я использую. Я только упомянул, что Duck набрал для любого, у кого есть мышление Java, который хочет перегружать по типу :) –