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


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 26. Мая 2006
Переопределение метода базового класса
27. Ноября 2009 :: 13:46
Печать  
Помогите, плиз, разобраться в проблеме.

Есть класс Базовый с методами:
[code]
Процедура СделатьЧтотоЕще() Экспорт
 // здесь ничего делать не нужно!
 // нужно делать что-то еще в классе-наследнике
КонецПроцедуры

Процедура СделатьЧтото() Экспорт
  СделатьЧтотоЕще();
КонецПроцедуры

Процедура Выполнить() Экспорт
 СделатьЧтото();
КонецПроцедуры
[/code]

Есть класс Наследник:Базовый
[code]
Функция GetThis(Конт) Возврат Конт; КонецФункции

Процедура СделатьЧтотоЕще() Экспорт
 // здесь нужно что-то сделать
 // но вместо этого метода отрабатывается метод базового класса
КонецПроцедуры

Процедура Выполнить() Экспорт
 //вызываем метод класса-родителя
 GetThis(Контекст).СделатьЧтото();
КонецПроцедуры
[/code]

Есть процедура, в которой все это должно работать
[code]
Процедура Сформировать()
 _объект = СоздатьОбъект("Наследник");
 _объект.Выполнить();
КонецПроцедуры
[/code]

Мне нужно чтобы метод СделатьЧтото(), определенный в базовом классе, вызывал метод СделатьЧтотоЕще(), определенный в классе-наследнике.

Но у меня упорно вызывается метод, определенный в базовом классе.

Подскажите, пожалуйста, в чем я не прав.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Переопределение метода базового класса
Ответ #1 - 27. Ноября 2009 :: 14:02
Печать  
Вроде как Базовый класс ничего не должен знать о классах-наследниках.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Переопределение метода базового класса
Ответ #2 - 27. Ноября 2009 :: 14:15
Печать  
Когда ты вызываешь СделатьЧтотоЕще() - ты вызываешь процедуру текущего модуля.
Для того, чтобы вызвать метод класса - нужно писать Сам(Контекст).СделатьЧтотоЕще()
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Переопределение метода базового класса
Ответ #3 - 27. Ноября 2009 :: 14:16
Печать  
JohnyDeath писал(а) 27. Ноября 2009 :: 14:02:
Вроде как Базовый класс ничего не должен знать о классах-наследниках.

Это безусловно верное утверждение, но сейчас оно абсолютно не в тему.
  
Наверх
www  
IP записан
 
alexmyt
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 26. Мая 2006
Re: Переопределение метода базового класса
Ответ #4 - 27. Ноября 2009 :: 14:29
Печать  
Перепробовал кучу вариаций вызовов, в том числе GetThis(Контекст).СделатьЧтотоЕще() - не помогает Печаль
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Переопределение метода базового класса
Ответ #5 - 27. Ноября 2009 :: 17:06
Печать  
[quote author=alexmyt link=1259329588/0#0 date=1259329588]
Есть класс Базовый с методами:
[code]
Процедура СделатьЧтотоЕще() Экспорт
 // здесь ничего делать не нужно!
 // нужно делать что-то еще в классе-наследнике
КонецПроцедуры

Процедура СделатьЧтото() Экспорт
  СделатьЧтотоЕще();
КонецПроцедуры

Процедура Выполнить() Экспорт
 СделатьЧтото();
КонецПроцедуры
[/code]

Подскажите, пожалуйста, в чем я не прав.[/quote]

[code]
Функция GetThis(Конт) Возврат Конт; КонецФункции

Процедура СделатьЧтотоЕще() Экспорт
 // здесь ничего делать не нужно!
 // нужно делать что-то еще в классе-наследнике
КонецПроцедуры

Процедура СделатьЧтото() Экспорт
  GetThis(Контекст).СделатьЧтотоЕще();
КонецПроцедуры

Процедура Выполнить() Экспорт
 GetThis(Контекст).СделатьЧтото();
КонецПроцедуры
[/code]

Остальное вроде бы нормально.
  
Наверх
www  
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Переопределение метода базового класса
Ответ #6 - 27. Ноября 2009 :: 17:15
Печать  
[quote author=alexmyt link=1259329588/0#0 date=1259329588]Помогите, плиз, разобраться в проблеме.
...
Мне нужно чтобы метод СделатьЧтото(), определенный в базовом классе, вызывал метод СделатьЧтотоЕще(), определенный в классе-наследнике.

Но у меня упорно вызывается метод, определенный в базовом классе.

Подскажите, пожалуйста, в чем я не прав.[/quote]

Может наследование тут не к месту ? например можно использовать композицию.
что то типа вот этого:

Код Класса2
[code]
...
Процедура СделатьКонкретное() Экспорт
   ....
КонецПроцедуры
...
[/code]

Код класса1:
[code]
Процедура СделатьЧтоТо() Экспорт
      ....
      к = СоздатьОбъект("Класс2");
      к.СделатьКонкретное();
      ....
Конецпроцедуры
[/code]

  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
alexmyt
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 26. Мая 2006
Re: Переопределение метода базового класса
Ответ #7 - 28. Ноября 2009 :: 06:33
Печать  
Всем спасибо, всё получилось! Улыбка

Моя ошибка была в том что у процедуры СделатьЧтотоЕще() в классе-наследнике не было указано слово Экспорт. Хоть это и внутренний метод класса-наследника, но без этого метод не переопределялся.

Здесь я привел правильный код, а у себя оставил код с косяком. Видимо, сказался вечер пятницы Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Переопределение метода базового класса
Ответ #8 - 30. Ноября 2009 :: 11:24
Печать  
fez писал(а) 27. Ноября 2009 :: 14:15:
Когда ты вызываешь СделатьЧтотоЕще() - ты вызываешь процедуру текущего модуля.
Для того, чтобы вызвать метод класса - нужно писать Сам(Контекст).СделатьЧтотоЕще()

Автору сабжа рекомендую юзать вирт().СделатьЧтотоЕще()
Так и быстрее, и читать код легче.
Работает как на 1С++ 2.5, так и на 3.Х
  

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