Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Рекурсия при вызове переопределенного метода (число прочтений - 3081 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Рекурсия при вызове переопределенного метода
10. Июля 2006 :: 10:31
Печать  
Значит есть у меня четыре класса: Т_Базовый, и от него три производных: Т_Производный, Т_Производный1, Т_Производный2. Есть только один переопределенный метод Выполнить.


------------------------------

Класс Т_Производный = Т_Производный.ert : Т_Базовый
{
    void Выполнить (void);
}

Класс Т_Производный1 = Т_Производный1.ert : Т_Базовый
{
    void Выполнить (void);
}

Класс Т_Производный2 = Т_Производный2.ert : Т_Базовый
{
    void Выполнить (void);
}

------------------------------


--------- Т_Базовый.ert -----------

Функция GetThis(Конт)
    Возврат Конт;
КонецФункции
           
Функция This()
    Возврат GetThis(Контекст);
КонецФункции
            
Процедура Выполнить_реал() Экспорт
    Сообщить("Т_Базовый::Выполнить_реал");
КонецПроцедуры

Процедура Выполнить() Экспорт
    This().Выполнить_реал();
КонецПроцедуры


------- Т_Производный.ert -------------
Перем мПр1, мПр2;

Функция GetThis(Конт)
    Возврат Конт;
КонецФункции
           
Функция This()
    Возврат GetThis(Контекст);
КонецФункции
            
Процедура Выполнить_реал() Экспорт
    Сообщить("Т_Производный::Выполнить_реал");
    мПр1.Выполнить();
    мПр2.Выполнить();
КонецПроцедуры

Процедура ПриОткрытии()
     Форма.Параметр._ПриОткрытии();
КонецПроцедуры

мПр1 = СоздатьОбъект("Т_Производный1");
мПр2 = СоздатьОбъект("Т_Производный2");



---- Т_Производный1.ert -------------

Функция GetThis(Конт)
    Возврат Конт;
КонецФункции
           
Функция This()
    Возврат GetThis(Контекст);
КонецФункции
            
Процедура Выполнить_реал() Экспорт
    Сообщить("Т_Производный1::Выполнить_реал");
КонецПроцедуры

Процедура ПриОткрытии()
     Форма.Параметр._ПриОткрытии();
КонецПроцедуры


---------- Т_Производный2.ert -------------

Функция GetThis(Конт)
    Возврат Конт;
КонецФункции
           
Функция This()
    Возврат GetThis(Контекст);
КонецФункции
            
Процедура Выполнить_реал() Экспорт
    Сообщить("Т_Производный2::Выполнить_реал");
КонецПроцедуры

Процедура ПриОткрытии()
     Форма.Параметр._ПриОткрытии();
КонецПроцедуры


------- Проверка классов -----

    лБаз = СоздатьОбъект("Т_Базовый");
    лПроиз = СоздатьОбъект("Т_Производный");
    лБаз.Выполнить();
    лПроиз.Выполнить();

------------------------------


В последней строке 1С вываливается, в отладчике видно что при выполнении строки "мПр1.Выполнить();" вызывается метод не класса "Т_Производный1", а метод класса "Т_Производный".
Из-за этого происходит зацикливание и ....
Это что? Глюк в 1С++ или что-то я неправильно написал?
  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Рекурсия при вызове переопределенного метода
Ответ #1 - 10. Июля 2006 :: 12:39
Печать  
Не понимаю, как оно у тебя вообще работает...
По идее, надо создание объектов в конструктор заталкивать, а не в конец модуля.
Попробуй
Код
Выбрать все
Процедура Конструктор()
   мПр1 = СоздатьОбъект("Т_Производный1");
   мПр2 = СоздатьОбъект("Т_Производный2");
КонецПроцедуры;
 

  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Рекурсия при вызове переопределенного метода
Ответ #2 - 11. Июля 2006 :: 12:54
Печать  
Точно, теперь заработало, спасибо
  
Наверх
ICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Рекурсия при вызове переопределенного метода
Ответ #3 - 11. Июля 2006 :: 14:05
Печать  
А какая разница? Несколько раз пользовался телом модуля как конструктором, никаких проблем не было.

В Яве, вот например, в подобном случае есть разница. Есть код - конструктор класса (условно говоря), и код - конструктор объекта.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Рекурсия при вызове переопределенного метода
Ответ #4 - 12. Июля 2006 :: 14:08
Печать  
ИМХО разница в том, что код из модуля и код из конструктора выполняются немного в разные моменты, поэтому и результат бывает различен Печаль
Т.е. код конструктора выполняется гарантированно, когда объект уже создан внутри 1С.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать