Полиморфизм в 1С++ Ключевые слова: 1С++, ООП, полиморфизм, виртуальный метод.
Для изменения поведения базового класса удобно реализовать полиморфные методы, вызываемые из базового класса. Пример такого использования: формирование бухгалтерской операции документа. Формируемые проводки зависят от вида документа, а их инициализация и запись общая для всех.
Чтобы формирование проводок было вызвано полиморфно, необходимо обратиться к нему через контекст.
//класс Проводки
Функция Этот(Конт)
Возврат Конт;
КонецФункции
Процедура СоздатьПроводки(Конт) Экспорт
Инициализация();
Этот(Контекст).Формирование(Конт);
Запись();
КонецПроцедуры
//класс ПроводкиПереоценки
Процедура Формирование(Конт) Экспорт
…
КонецПроцедуры
//использование
ПроводкиПереоценки = СоздатьОбъект(«ПроводкиПереоценки»);
ПроводкиПереоценки.СоздатьПроводки(Контекст);
Переопределенный метод обязательно должен быть объявлен как «Экспорт». В базовом классе, если нет необходимости, его вообще можно не определять (абстрактный метод). Однако, это приведет естественно к ошибке в случае использования из экземпляра непосредственно базового класса или из дочернего класса, в котором метод не переопределен (он вообще не определен :-)). Во избежание ошибки, его нужно определить обязательно с директивой «Экспорт».
Для вызова из дочернего класса метода, определенного в базовом, также необходимо использовать контекст.
//дочерний класс
Функция БазовыйОбъект(Конт)
//получаем контекст экземпляра базового класса
Возврат Конт.ПолучитьБазовыйКласс("ИмяБазовогоКласса");
КонецФункции
Процедура МояПроцедура() Экспорт
БазовыйОбъект(Контекст).БазоваяПроцедура();
КонецПроцедуры
Базовая процедура должна быть определена с директивой «Экспорт».
|