Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Полиморфизм ЗаменитьЭксзБазовогоКласса 2 (число прочтений - 5163 )
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Полиморфизм ЗаменитьЭксзБазовогоКласса 2
01. Июня 2006 :: 12:07
Печать  
Краткая выжимка предыдущей ветки (сама ветка - http://www.1cpp.ru/forum/YaBB.pl?num=1148933034).



Проблема №1.

Есть два документа, и два класса, расширяющих функционал штатных 1С-вых документов.
Например "Документ.РКО" => "Документ_РКО" и "Документ.РКО_Вексельный" => "Документ_РКО_Вексельный".
Смотрим мы в модуль проведения каждого из этих документов и видим, что у нас имеется одинаковая последовательность методов:

Код
Выбрать все
_Сам = СоздатьОбъект("Документ_РКО");
_Сам.ЗаменитьЭксзБазовогоКласса("Документ.РКО", Контекст);
_Сам.__Инит__();
 



В _Сам.__Инит__() происходит расчет всяких разных нужных данных. Например бухитогов на позицию документа. Более того, метод __Инит__() для обоих классов одинаковый, и реализован в суперклассе "Документы_СБухИтогами".

Итоговая иерархия вот такая:
defcls.prm
Код
Выбрать все
класс Документы_СБухИтогами = __Документы_СБухИтогами@MD
{
    void __Инит__();
};

класс Документ_РКО = __Документ_РКО@MD : Документ.РКО, Документы_СБухИтогами
{};

класс Документ_РКО_Вексельный = __Документ_РКО_Вексельный@MD : Документ.РКО_Вексельный, Документы_СБухИтогами
{};
 



Хочется и строчку _Сам.ЗаменитьЭксзБазовогоКласса("Документ.РКО", Контекст); засунуть в этот самый __Инит__(), с тем чтобы это выглядело примерно так:
Код
Выбрать все
_Сам = СоздатьОбъект("Документ_РКО");
_Сам.__Инит__(Контекст);
 



При этом в методе Документы_СБухИтогами::__Инит__(КонтекстДокумента) первой строчкой будет стоять вот такое:
Код
Выбрать все
Сам(Контекст).ЗаменитьЭксзБазовогоКласса("Документ."+КонтекстДокумента.Вид(), КонтекстДокумента)
 



Так вот, когда такое делаешь - реальной замены базового класса не происходит. То есть если в тот же самый __Инит__ следующими строчками вставить
Код
Выбрать все
Сообщить(""""+КонтекстДокумента.Фирма+"""");
Сообщить(""""+Сам(Контекст).Фирма+"""");
 


то будет написано
Цитата:
"ООО Альтерпласт"
""




Проблема №2.

Строение класса Док_Продажа
Код
Выбрать все
Проведение   Регистры		Регистры
	|		|				|
	|	Регистр_Товары		Регистр_Взаиморасчеты
	|		|				|
     ------------------------------------------------
			  |
		   Док_Продажа
 


Если в каком-то из методов класса Регистр_Взаиморасчеты сделать ЗаменитьЭкземплярБазовогоКласса("Регистры"), то при полиморфном выполнении поиск класса регистры начнется с Док_Продажа, слева направо, снизу вверх, и заменит что? Регистр_Товары -> Регистры.

Согласись, это не гуд. Класс не должен зависеть от того, куда его потом встроят.



Возможный способ решения данной коллизии:

Цитата:
ПолучитьБазовыйКласс() не обеспечивает неполиморфности в модуле самого класса.
Если бы была возможность написать что-то вроде Сам(Контекст).ПолучитьБазовыйКласс(Сам(Контекст)), с тем, чтобы получить такой же Сам(Контекст), но неполиморфный, тогда коллизию удалось бы избежать.




Продолжаем разговор. Прошу на общетеоретические вопросы не отвлекаться.
« Последняя редакция: 01. Июня 2006 :: 18:45 - fez »  
Наверх
www  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса 2
Ответ #1 - 01. Июня 2006 :: 18:20
Печать  
Дык эта... прошу пояснить для тех, кто в танке: здесь предполагается лабораторная работа по изучению проблем наследования или, все же, поиск оптимального решения задачи, оставшейся за кадром?
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса 2
Ответ #2 - 01. Июня 2006 :: 18:27
Печать  
Палыч, какой ты скушный стал. Какая же это работа - не видишь, мы развлекаемся Улыбка

P.S.
Ну и еще немного думаем, нельзя ли реализацию классов в 1cpp сделать более корректной.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса 2
Ответ #3 - 01. Июня 2006 :: 18:40
Печать  
По теме.
Да не нужно ничего менять.

Я когда предлагал сделать ЗаменитьБазовыйОбъект() виртуальным, я предполагал, что проблема повторного наследовании в 1cpp не решена и, соответственно, ее нужно будет решать вместе с виртуализацией этого метода.

Т.е. что у нас будет выбор и возможность для маневра.
Но я совсем забыл про метод ПолучитьБазовыйКласс().

Поскольку orefkov нам все разъяснил, вопрос как таковой снимается.
Первое решение, которое пришло в голову - это дополнительный параметр - контекст созданного объекта - при вызове суперкласса, который устанавливает объект другого суперкласса, будет оптимальным.

Можно и обратный вызов, но зачем.

Короче, решение найдено, тема исчерпана.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса 2
Ответ #4 - 01. Июня 2006 :: 18:41
Печать  
Палыч писал(а) 01. Июня 2006 :: 18:20:
Дык эта... прошу пояснить для тех, кто в танке: здесь предполагается лабораторная работа по изучению проблем наследования или, все же, поиск оптимального решения задачи, оставшейся за кадром?


Кхм. Перестали ли вы пить коньяк по утрам?
Для лабораторных работ выделено три ветки. Тут я хочу...

А впрочем лично я уже ничего не хочу, ибо бессмысленно. Ибо мое хотение должно было логически перетечь в исправление внутри 1С++, а делать этого наверное уже никто не будет.
Я сам слишком ленив и обойдусь (уже обошелся) функцией в глобнике. kms будет использовать свой делегат, и ему мой Эксз вообще не вперся. Ну а orefkov будет продолжать строить ромбы.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса 2
Ответ #5 - 01. Июня 2006 :: 18:42
Печать  
Ну ты не впадай в пессимизм за мной-то. Я завтра снова буду полон сил, наверное.

P.S. Это же не твои, а мои идеи нах#р никому не нужны сегодня.
Потом orefkov может чем-то поделится. Не знаю, может и получится что-то.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса 2
Ответ #6 - 02. Июня 2006 :: 06:20
Печать  
Мое имхо - правильным решением будет убрать вообще метод ЗаменитьЭкземпляр, а добавить системный объект, с именем допустим "Конструктор" и методом Создать. Который и использовать вместо СоздатьОбъект. Данный метод будет сразу конструировать объект класса из необходимый частей и вызывать конструкторы. Типа примерно так:
Код
Выбрать все
_Сам = глКонструктор.Создать("Документ_РКО", Контекст);
 



Только надо определится с форматом, как указывать, какие из частей класса необходимо заменить на уже готовые объекты, какой конструктор вызывать.

Можно в нем еще и метод "Привести" сделать. Типа:
Код
Выбрать все
База = глКонструктор.Привести(Контекст, "МойБазовыйКласс");
 



Только это наверное уже будет не "Конструктор", а что-то типа "RunTimeSupport"
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса 2
Ответ #7 - 02. Июня 2006 :: 08:41
Печать  
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать