Pergunta

Eu tenho algumas perguntas sobre construtores em ColdFusion:

  1. i deve usar o nome init como o nome do construtor?
  2. Se eu criar uma instância do componente sem invocar o método init, o que é retornado?

    = exemplo createObject ( "componente", "cfcName"); // o valor agora instância hold

  3. i pode tomar o código no método init para fora e excluir o método init, em seguida, cole o código para a cabeça do componente, é ter um mesmo efeito que o construtor de inicialização?

grandes graças.

Foi útil?

Solução

i deve usar o nome de init como o nome do construtor?

Não, você pode nomear a função de inicialização de qualquer jeito que você gosta. init() é apenas uma convenção. E não é construtor real, uma vez que não é chamado automaticamente.

Se eu criar uma instância do componente sem invocar o método init, o que é retornado?

A instância do componente é devolvido, como seria de esperar. A presença ou ausência de uma função init() é completamente irrelevante. Não há noção de funções estáticas em componentes do ColdFusion, você sempre obter uma instância totalmente construído a partir GetObject("component", ...). (Não é assim para objetos Java, que são construídos apenas antes da primeira utilização, se você esqueceu de / não fazê-lo manualmente.)

i pode tomar o código no método init para fora e excluir o método init, em seguida, cole o código para a cabeça do componente, é ter um mesmo efeito que o construtor de inicialização?

Sim, desde que o método init() não tomar quaisquer parâmetros, não há diferença.

No entanto, é uma convenção para ter um método chamado init() que retorna a instância do componente. Mesmo que ele faz nada para além de "<cfreturn this>". Eu ia ficar consistente e adicionar um para cada componente, mesmo se não fosse estritamente necessário.

Outras dicas

A resposta de Tomalak é correto para ColdFusion 8; no entanto as coisas estão mudando um pouco com o ColdFusion 9, que deve sair ainda este ano. (Por uma questão de exaustividade, vou copiar na resposta do Tomalak e ajustar conforme o caso, então obrigado pela vantagem:.))


I deve usar o nome de init como o nome do construtor?

CF8: Não, você pode nomear a função de inicialização qualquer coisa que você gosta - "init" é apenas uma convenção. E não é um verdadeiro construtor, uma vez que não é chamado automaticamente.

CF9: A resposta ainda é "não", você não Have a . Mas pode convir que você: Isto aplica-se à criação de objetos dentro cfscript (ou componentes somente roteiro, que também estão vindo em CF9). As palavras-chave import e new estão sendo adicionados, e você será capaz de criar uma instância de um objeto assim:

import model.security.*;
userObj = new User();

Isso pressupõe que você tem um User.cfc dentro da pasta model/security/. Além disso, CF9 vai olhar para a existência de qualquer um método chamado "init" ou um com o mesmo nome que o objeto ( "Usuário", neste caso), e implicitamente chamar isso como o construtor.

Eu não tenho certeza se passando em argumentos para a directiva new irá encaminhá-los para o construtor como você veria em Java / C. Presumo que vai, mas eu não vi nenhum apresentações ou exemplos de código que indicam uma forma ou de outra, ainda; e não testei isso sozinho, porque ele só me ocorreu enquanto escrevia este. ..;) (Outra idéia: Eu me pergunto se vários construtores com diferentes argumentos conjuntos serão apoiados eu duvido, mas é uma idéia pura)

Eu assumo há alguma implicação de que uma funcionalidade semelhante pode aparecer em CFML (a linguagem baseada em tags, separar cfscript), mas nada foi dito sobre isso neste momento.

Se eu criar uma instância do componente sem invocar o método init, o que é retornado?

A instância do componente é devolvido, como seria de esperar. A presença ou ausência de uma função de inicialização () é completamente irrelevante. Não há noção de funções estáticas em componentes do ColdFusion, você sempre obter uma instância totalmente construído a partir GetObject ( "componente", ...). (Não é assim para objetos Java, que são construídos apenas antes da primeira utilização, se você esqueceu de / não fazê-lo manualmente.)

Posso tomar o código no método init para fora e excluir o método init, em seguida, cole o código para a cabeça do componente, é ter um mesmo efeito que o construtor de inicialização?

Sim, desde como o método init () não tomar quaisquer parâmetros, não há diferença.

No entanto, é uma convenção para ter um método chamado init () que retorna a instância do componente ( "isto"). Mesmo que ele não faz nada além de "return this;". Eu ia ficar consistente e adicionar um para cada componente, mesmo se não fosse estritamente necessário.

Algumas bibliotecas 3rd party / frameworks podem esperar init ser a função de construtor (obviamente, pré-CF9). Por exemplo, eu acredito olhares Coldspring para um método chamado initwhen tentando passar em argumentos do construtor.

Em resposta a resposta de Adão, eu tenho certeza que vários construtores não será parte de CF9, uma vez que exigiria a sobrecarga de método, que eu não ouvi nada sobre. A solução usual é para tirar proveito de digitação Pato e verificar argumentos para o tipo, e fornecendo argumentos opcionais (a capacidade de passar em argumentos nomeados faz isso bastante fácil de manusear).

Um link para a apresentação de Sean Corfield em Typing Pato: http://corfield.org/articles/ducktyping_cfunited .pdf

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top