2013-07-09 1 views
4

Я надеюсь, что кто-то может объяснить это поведение, поскольку я нахожу это довольно усугубляющим. У меня есть родительский класс с OnMissingMethod реализации, чтобы обеспечить неявные добытчиками/сеттеры (старые приложения CF8)Необходимость использования этой возможности с OnMissingMethod в расширенном классе

если экземпляр класса ребенка, как Foo и вызвать foo.getBar() из внешнего файла, его успешно запускает OnMissingMethod, но если внутри класса foo я вызываю getBar(), это не так. Единственный способ, с помощью которого он будет запускать OnMissingMethod, - это использовать this.getBar(), который мне не нравится по причинам эстетики и несоответствия кода.

tldr; вот пример кода ... попробуйте сами.

Foo.cfc

<cfcomponent output="false" extends="Parent"> 

     <cffunction name="init" output="false" returntype="Foo"> 
      <cfreturn this /> 
     </cffunction> 

     <cffunction name="getInternalBar_workie"> 
      <cfreturn this.getBar() /> 
     </cffunction> 

     <cffunction name="getInternalBar_noworkie"> 
      <cfreturn getBar() /> 
     </cffunction> 

</cfcomponent> 

Parent.cfc

<cfcomponent output="false"> 

    <cffunction name="OnMissingMethod"> 
     <!--- always return true for this example ---> 
     <cfreturn true /> 
    </cffunction> 

</cfcomponent> 

foobar.cfm

<cfset foo = CreateObject("component", "Foo").init() /> 

<!--- this works ---> 
<cfdump var="#foo.getBar()#" /><br/> 
<!--- this works ---> 
<cfdump var="#foo.getInternalBar_workie()#" /><br/> 
<!--- this fails ---> 
<cfdump var="#foo.getInternalBar_noworkie()#" /> 

Может кто-нибудь объяснить, почему 'this' scope должен использоваться для OnMissingMethod для правильной работы при вызове из самого класса? Есть ли лучшее обходное решение?

+0

После рассмотрения ответа Адама, похоже, вы застряли. Какова фактическая проблема, которую вы пытаетесь решить, вызвав несуществующие методы таким образом? – imthepitts

+0

У меня есть большой объем услуг (+/- 1000), которые имеют зависимости от других сервисов. Я использую ColdSpring для управления DI и инъекционными услугами, используя инъекцию свойств. Это, конечно, требует наличия доступного геттера для внедренной службы внутри целевой службы. Вместо того, чтобы явным образом выписывать тысячи методов улавливания плиты котла, все они делают то же самое, я сделал все службы, расширяя BaseService, и в этом классе у меня есть метод OnMissingMethod, который ищет шаблоны getFooService() и setFooService (fooService) и делает это. .. –

+0

... соответствующая работа установки, помещая их в переменную ["_ dependencies"] коллекции в цель. Недостатком является то, что при правильной настройке в любое время, когда я хочу ссылаться на инъецированную службу, которую я либо должен делать: переменные ["_ dependencies"]. FooService ИЛИ this.getFooService(). Проблема с этим.getFooService() заключается в том, что она несовместима с тем, как я вызываю другие методы в одном классе. Конечно, это не критическая проблема, но это не значит, что мне это нравится. –

ответ

2

Благодарим за Google. Я не знал ответа, но googled «coldfusion onmissingmethod this scope», и первый матч объяснил вашу ситуацию in one of the comments. Я чувствую себя плохо для воспроизведения работы Эллиотта, но он получает ответ на ваш вопрос:

[...]

ХФУ только проксируемых страницы. CreateObject() возвращает TemplateProxy , который обертывает CFPage, который является вашим фактическим кодом.

[...]

при вызове функции, как «this.getFoo()» или из снаружи, как «myObject.getFoo()», вместо того, что происходит в том, что он вызывает метод на TemplateProxy для вызова метода, который в свою очередь вызывает функцию на прокси-странице.

Управление OnMissingMethod существует в функции invoke() на TemplateProxy , поэтому он работает только извне или через область .

[...]

-1

Это показывает разницу между государственными и частными членами членов. Вызов getBar() не является ярлыком для общего доступа this.getBar(). Это ярлык для частного variables.getBar(), которого нет в Parent.cfc. Частная функция variables.getBar() существует только в области переменных Foo.cfc. Поскольку это общедоступная функция, она также доступна как открытый член всего экземпляра класса в пределах области this.Родитель не может ссылаться на частные переменные внутри расширенного (дочернего) объекта. Но родитель может ссылается на публикуемые.

+0

Это не то, что происходит. –

 Смежные вопросы

  • Нет связанных вопросов^_^