Краткая выжимка предыдущей ветки (сама ветка -
http://www.1cpp.ru/forum/YaBB.pl?num=1148933034).
Проблема №1.
Есть два документа, и два класса, расширяющих функционал штатных 1С-вых документов.
Например "Документ.РКО" => "Документ_РКО" и "Документ.РКО_Вексельный" => "Документ_РКО_Вексельный".
Смотрим мы в модуль проведения каждого из этих документов и видим, что у нас имеется одинаковая последовательность методов:
_Сам = СоздатьОбъект("Документ_РКО");
_Сам.ЗаменитьЭксзБазовогоКласса("Документ.РКО", Контекст);
_Сам.__Инит__();
В _Сам.__Инит__() происходит расчет всяких разных нужных данных. Например бухитогов на позицию документа. Более того, метод __Инит__() для обоих классов одинаковый, и реализован в суперклассе "Документы_СБухИтогами".
Итоговая иерархия вот такая:
defcls.prm
класс Документы_СБухИтогами = __Документы_СБухИтогами@MD
{
void __Инит__();
};
класс Документ_РКО = __Документ_РКО@MD : Документ.РКО, Документы_СБухИтогами
{};
класс Документ_РКО_Вексельный = __Документ_РКО_Вексельный@MD : Документ.РКО_Вексельный, Документы_СБухИтогами
{};
Хочется и строчку _Сам.ЗаменитьЭксзБазовогоКласса("Документ.РКО", Контекст); засунуть в этот самый __Инит__(), с тем чтобы это выглядело примерно так:
_Сам = СоздатьОбъект("Документ_РКО");
_Сам.__Инит__(Контекст);
При этом в методе Документы_СБухИтогами::__Инит__(КонтекстДокумента) первой строчкой будет стоять вот такое:
Сам(Контекст).ЗаменитьЭксзБазовогоКласса("Документ."+КонтекстДокумента.Вид(), КонтекстДокумента)
Так вот, когда такое делаешь - реальной замены базового класса не происходит. То есть если в тот же самый __Инит__ следующими строчками вставить
Сообщить(""""+КонтекстДокумента.Фирма+"""");
Сообщить(""""+Сам(Контекст).Фирма+"""");
то будет написано
Цитата:"ООО Альтерпласт"
""
Проблема №2.
Строение класса Док_Продажа
Проведение Регистры Регистры
| | |
| Регистр_Товары Регистр_Взаиморасчеты
| | |
------------------------------------------------
|
Док_Продажа
Если в каком-то из методов класса Регистр_Взаиморасчеты сделать ЗаменитьЭкземплярБазовогоКласса("Регистры"), то при полиморфном выполнении поиск класса регистры начнется с Док_Продажа, слева направо, снизу вверх, и заменит что? Регистр_Товары -> Регистры.
Согласись, это не гуд. Класс не должен зависеть от того, куда его потом встроят.
Возможный способ решения данной коллизии:
Цитата:ПолучитьБазовыйКласс() не обеспечивает неполиморфности в модуле самого класса.
Если бы была возможность написать что-то вроде Сам(Контекст).ПолучитьБазовыйКласс(Сам(Контекст)), с тем, чтобы получить такой же Сам(Контекст), но неполиморфный, тогда коллизию удалось бы избежать.
Продолжаем разговор. Прошу на общетеоретические вопросы не отвлекаться.