2014-11-30 3 views
3

У меня возникла неожиданная проблема с языком разметки ColdFusion. Допустим, у меня есть следующие компоненты. Если как публичная, так и частная функция определены в «базовом» компоненте, может ли первый все еще ссылаться на частный при вызове из экземпляров расширяемого типа «под»?Доступ к публично-частному доступу через наследование компонентов в ColdFusion

Program.cfc

<cfcomponent> 

    <cffunction access="public" name="doOperation"> 
     <cfset this.checkValue(-14)> 
    </cffunction> 


    <cffunction access="private" name="checkValue"> 
     <cfargument name="notNeg" required="yes" type="numeric"> 

     <cfif arguments.notNeg LT 0 > 
      <cfthrow message="Negative Numbers not allowed"> 
     </cfif> 
    </cffunction> 

</cfcomponent> 

SubProgram.cfc

<cfcomponent extends="Program"> 

</cfcomponent> 

Run.cfm

<cfobject component="SubProgram" name="this.instance"> 

<cfset this.instance.doOperation()>      <<<<----ERROR---->>>> 

ColdFusion бросает е rror

способ checkValue не был найден в компоненте SubProgram. Убедитесь, что метод определен ...

В чем проблема? Никаких точек погрешности для инкапсуляции!

ответ

4

Проблема заключается в том, что вы пытаетесь вызвать метод checkValue() как метод public. this не работает в CFML так же, как на других языках (очень плохое дизайнерское решение со стороны Macromedia): this является внешней ссылкой на сам объект, поэтому, если вы вызываете this.someMethod(), это пытается вызвать public метод называется someMethod() (как если бы вы звонили myObject.someMethod()). На языке CFML область variables является ссылкой на частным данных/членов.

Что вы хотите сделать это:

<cffunction access="public" name="doOperation"> 
    <cfset variables.checkValue(-14)> 
</cffunction> 

Или просто:

<cffunction access="public" name="doOperation"> 
    <cfset checkValue(-14)> 
</cffunction> 

Кроме того, если вы используете последнюю версию CF (например: CF10 или CF11) вы действительно хотите не писать свои компоненты в тегах. Это делает довольно ужасный код. Попытайтесь ограничить использование тегов для просмотра файлов. CF10 по-прежнему не поддерживает 100% всех конструкций CFML в скрипте, но CF11 делает это.

+0

Спасибо, я знал, что не сумасшедший. BTW это CF8. – Euler

+1

Ах, ОК: придерживайтесь тегами. Вы не можете перейти на поддерживаемую версию CF (например: 10 или 11?). 8 - немного мусор. –