Пример переопределения функции
<< Click to Display Table of Contents >> Разработка > Процесс разработки > Что использовать: наследование или перекрытие > Наследование Пример переопределения функции |
Ситуация
Есть базовый тип документа «Официальный документ» (OfficialDocument), у которого в событии До сохранения вызывается функция FillName(). С помощью этой функции автоматически заполняется имя документа, если для вида документа администратор установил флажок Формировать имя документа автоматически.
// Вызов функции для формирования имени документа в событии "До сохранения".
Functions.OfficialDocument.FillName(_obj);
Имя документа составляется по формату <Вид документа> <ИД документа>.
// Код функции.
public virtual void FillName()
{
_obj.Name = _obj.DocumentKind + " " + _obj.Id.ToString();
}
Предположим, у типа документа OfficialDocument есть два наследника. Необходимо, чтобы для каждого наследника имя документа формировалось следующим образом:
•<Вид документа> <ИД документа> <Номер регистрации> для первого типа документа;
•<Вид документа> №<Номер> <Имя контрагента> для второго типа документа.
Решение
Сначала рассмотрим, как изменить формат имени для первого типа документа на следующий: <Вид документа> <ИД документа> <Номер регистрации>.
Для этого необходимо переопределить логику функции FillName() базового типа:
1.В редакторе типа документа, который является наследником, добавьте разделяемую функцию FillName() с модификатором override:
public override void FillName()
{
base.FillName();
_obj.Name += " " + _obj.RegistrationNumber.ToString();
}
К формату имени добавляется номер регистрации. Таким образом к логике функции базового типа сущности добавляется новая логика, поэтому добавлен вызов базового обработчика события.
2.Перейдите в узел «Свойства». В событии Изменение значения свойства вызовите функцию FillName() для тех свойств, значения которых влияют на имя документа.
В данном случае только для свойства Рег. № (RegistrationNumber):
public virtual void RegistrationNumberChanged(DirRX.AppModule.Shared.StringPropertyChangedEventArgs)
{
FillName();
}
Теперь рассмотрим, как изменить формат имени для второго типа документа на следующий: <Вид документа> №<Номер> <Имя контрагента>. С таким форматом могут быть, например, заявки на проверку контрагента, которые используются при заключении договоров. Предполагается, что для второго типа документа уже добавлено свойство Контрагент (Counterparty).
Для изменения формата имени второго типа документа необходимо полностью переопределить логику функции FillName() базового типа:
1.В редакторе типа документа, который является наследником, добавьте разделяемую функцию FillName() с модификатором override:
public override void FillName()
{
//Получить вид документа.
var documentKind = _obj.DocumentKind;
//Очистить имя.
if (documentKind != null && !documentKind.GenerateDocumentName.Value && _obj.Name == Sungero.Docflow.OfficialDocuments.Resources.DocumentNameAutotext)
_obj.Name = string.Empty;
if (documentKind == null || !documentKind.GenerateDocumentName.Value)
return;
var name = string.Empty;
// Заполнить имя в формате: <Вид документа> №<Номер> <Имя контрагента>.
using (TenantInfo.Culture.SwitchTo())
{
// Добавить к имени №<Номер>.
if (!string.IsNullOrWhiteSpace(_obj.RegistrationNumber))
name += Sungero.Docflow.OfficialDocuments.Resources.Number + _obj.RegistrationNumber;
// Добавить к имени <Имя контрагента>.
if (_obj.Counterparty != null)
name += " " + _obj.Counterparty.DisplayValue;
}
if (string.IsNullOrWhiteSpace(name))
name = Sungero.Docflow.OfficialDocuments.Resources.DocumentNameAutotext;
else if (_obj.DocumentKind != null)
name = _obj.DocumentKind.ShortName + name;
_obj.Name = Sungero.Docflow.PublicFunctions.Module.TrimSpecialSymbols(name);
}
Так как логика функции базового типа сущности полностью переопределяется, то базовый обработчик события вызывать не нужно.
2.Перейдите в узел «Свойства». В событии Изменение значения свойства вызовите функцию FillName() для тех свойств, значения которых влияют на имя документа.
В данном случае для двух свойств:
•Рег. № (RegistrationNumber):
public virtual void RegistrationNumberChanged(DirRX.AppModule.Shared.StringPropertyChangedEventArgs)
{
FillName();
}
•Контрагент (Counterparty):
public virtual void CounterpartyChanged(DirRX.AppModule.Shared.CounterpartyRequestCounterpartyChangedEventArgs e)
{
FillName();
}
© Компания Directum, 2024 |