Замещение исходного кода (C#)

Средний

Замещающим конфигурационным элементом является класс. Для упрощения понимания можно использовать понятие «производный» вместо «замещающий», «базовый» вместо «замещаемый». У алгоритма замещения класса есть свои особенности, которые рассмотрены далее.

Создание замещающего класса

Для создания замещающего исходного кода следуйте шагам:

  1. Откройте раздел «Конфигурация».
  2. Выберите пакет, в который хотите добавить замещающую схему.
  3. Откройте свойства пакета. В блоке «Зависит от пакетов» проверьте наличие пакета, элемент которого хотите заместить. Если данного пакета нет, добавьте зависимость от нужного пакета.
  4. На панели инструментов рабочей области раздела «Конфигурация» нажмите «Добавить» и выберите «Исходный код».

Рисунок 1 — Конфигурационный элемент «Исходный код»

Рисунок 1 — Конфигурационный элемент «Исходный код»

  1. В дизайнере исходного кода создайте класс, который является наследником замещаемого (базового).
  2. Отметьте замещающий (производный) класс атрибутом [Override].
  3. Реализуйте необходимую функциональность.

    Переопределению подлежат свойства и методы базового класса, отмеченные ключевым словом virtual. Также можно реализовать абстрактные методы базового класса. В производном классе для свойств и методов добавьте ключевое слово override.

  4. Сохраните и опубликуйте класс.

Механизм замещения

Созданием экземпляра замещающего (производного) класса занимается фабрика объектов замещающих классов. При первом обращении система анализирует конфигурационную сборку, находит классы, помеченные Override, и строит соответствия между базовыми и производными типами. Если в цепочке наследования несколько уровней, итоговой заменой становится последний наследник, а промежуточные типы отдельно не используются как результат замещения.

Атрибут Override является наследником базового типа System.Attribute и находится в пространстве имен BPMSoft.Core.Factories. Подробнее с пространством имен BPMSoft.Core.Factories можно ознакомиться в Библиотеке .NET классов. Данный атрибут используется для построения дерева зависимостей замещающих (производных) и замещаемых (базовых) типов фабрики. Атрибут применяется только к классам.

Рассмотрим шаблон применения атрибута:

[Override]
/// <summary>
/// SubstituteClass -- Замещающий (производный) класс
/// SubstitutableClass -- Замещаемый (базовый) класс
/// </summary>
public class SubstituteClass : SubstitutableClass
{
	// Реализация логики замещения класса
}

Для создания объекта используется статический класс ClassFactory. Данный класс реализует фабрику создания замещающих (производных) объектов. Фабрика использует open-source фреймворк внедрения зависимостей Ninject. Более подробно со статическим классом ClassFactory можно ознакомиться в библиотеке .NET классов.

В момент инициализации фабрики она собирает информацию обо всех замещаемых (базовых) типах. Инициализация происходит в момент первого обращения к ней, то есть при первой попытке получить экземпляр замещающего (производного) типа.

Алгоритм работы фабрики:

  1. Поиск замещающих (производных) типов.
    Фабрика анализирует конфигурационную сборку. Помеченные атрибутом Override классы интерпретируются как замещающие (производные), а родители этих классов — как замещаемые (базовые).
  2. Формирование дерева зависимостей.
    Фабрика формирует список пар значений: замещаемый (базовый) тип → замещающий (производный) тип.
В дереве иерархии замещения не учитываются промежуточные типы.
  1. Замещение исходного класса.
    Исходный тип замещает последний в иерархии наследник.
  2. На основе дерева зависимостей выполняется привязка типов замещения. Для этого используется фреймворк Ninject.

Рассмотрим пример получения экземпляра типа (класса): есть три класса:

  • Класс A — базовый класс;
  • Класс B — наследник класса A;
  • Класс C — наследник класса B.

По иерархии классов будет простроено дерево зависимостей:

ClassA → ClassC
ClassB → ClassC

При построении дерева зависимостей не будут учтены промежуточные классы:

ClassA → ClassB → ClassC

ClassC в данном случае будет замещающим классом для ClassA и ClassB, так как является последним в иерархии. То есть при запросе экземпляра типа ClassA или ClassB фабрика вернет ClassC.

Получение экземпляра замещаемого типа

Для получения экземпляра замещаемого типа необходимо использовать метод Get<T> класса ClassFactory.

var substituteObject = ClassFactory.Get<SubstitutableClass>();

В результате будет создан экземпляр класса SubstituteClass. Подробнее ознакомиться с параметризированным методом Get<T> можно в Библиотеке .NET классов.

Метод Get<T> может принимать параметры конструктора в виде массива объектов ConstructorArgument. Каждый элемент такого массива соответствует одному аргументу конструктора создаваемого класса. Это позволяет фабрике создавать экземпляры замещающих классов с параметризованными конструкторами. При этом все остальные зависимости, необходимые для создания и работы объекта, фабрика определяет и инициализирует автоматически.

Конструкторы и создание экземпляров

Рекомендуется, чтобы сигнатуры конструкторов замещающего класса соответствовали сигнатурам конструкторов замещаемого класса. Если логика замещающего класса требует использования конструктора с пользовательской сигнатурой, при реализации следует учитывать один из следующих сценариев.

Варианты реализации конструкторов:

  • Замещаемый класс использует только конструктор по умолчанию. В этом случае в замещающем классе допускается определение своего конструктора без каких-либо ограничений. При этом соблюдается стандартный порядок вызовов конструкторов родительского (замещаемого | базового) и дочернего (замещающего | производного) классов. В этом случае необходимо помнить, что при создании замещаемого класса через фабрику ей необходимо передавать параметры для корректной инициализации свойств замещающего класса;
  • Замещаемый класс содержит параметризованный конструктор. В этом случае в замещающем классе также должен быть реализован конструктор. Конструктор замещающего класса должен явно вызывать параметризованный конструктор родительского (замещаемого | базового) класса и передавать ему параметры, необходимые для корректной инициализации родительских свойств. При этом конструктор замещающего класса может инициализировать собственные свойства либо оставаться пустым.

Несоблюдение правил приводит к ошибке во время выполнения. Корректность инициализации свойств замещающего (производного) и замещаемого (базового) классов в этом случае остается зоной ответственности разработчика.

Рекомендуем изучить

Замещающий объект
Замещающий клиентский модуль

Материал был полезен для вас?
Заявка на индивидуальный тренинг
Заявка на обучение в формате тренинга
Заявка на консультацию по обучению
Готовы сделать выбор CRM? (детальная)
Оставьте заявку, и наши эксперты бесплатно проконсультируют вас, подберут подходящую конфигурацию и рассчитают стоимость проекта.
Предпочитаемый способ связи
Готовы сделать выбор CRM?
Оставьте заявку, и наши эксперты бесплатно проконсультируют вас, подберут подходящую конфигурацию и рассчитают стоимость проекта.
Предпочитаемый способ связи
Вебинар: 25 июня в 11:00
Приглашаем вас на вебинар: BPMSoft CRM без отраслевых границ. От трейдинга до здравоохранения. Опыт и цифры
Готовы сделать выбор CRM? (детальная)
Оставьте заявку, и наши эксперты бесплатно проконсультируют вас, подберут подходящую конфигурацию и рассчитают стоимость проекта.
Предпочитаемый способ связи
Готовы сделать выбор CRM?
Оставьте заявку, и наши эксперты бесплатно проконсультируют вас, подберут подходящую конфигурацию и рассчитают стоимость проекта.
Предпочитаемый способ связи
Регистрация на мероприятие
Оставить заявку
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время.
Предпочитаемый способ связи
Демонстрационная версия BPMSoft
Заполните заявку для получения бесплатного доступа к демонстрационному стенду на 14 дней.
Типовое внедрение
Внедрите BPMSoft CRM в свою компанию всего за 8 рабочих дней по фиксированной цене! Заполните заявку для уточнения условий.
Предпочитаемый способ связи
Заказать презентацию
Наш менеджер свяжется с Вами в ближайшее время.
Предпочитаемый способ связи
Рассчитать стоимость
Предпочитаемый способ связи
Лучшие CRM-системы в России: выводы Фонда «Сколково»
Какие CRM выбирают крупнейшие российские компании? Скачайте исследование рынка CRM-систем 2026 от Фонда «Сколково» и TAdviser
Задать вопрос
Предпочитаемый способ связи
Есть вопросы?
Не нашли для себя подходящую вакансию, или остались вопросы?
*
Есть вопросы?
Не нашли для себя подходящую вакансию, или остались вопросы?
*
Присоединяйтесь к партнерской сети BPMSoft
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время
Тип партнерства*
Управление полным жизненным циклом клиента: от генерации лидов и продаж до внедрения, поддержки и продления подписки.
Разработка собственного Приложения – производного программного обеспечения, созданного на платформе BPMSoft (Базовое ПО).
Заявка на онлайн-консультации по BPMSoft
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время
Стать образовательным партнёром
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время.
Заявка на консультацию
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время.
Подписка
Спасибо!
Ваша заявка принята.
Спасибо!
Ваша заявка принята.
Наш сотрудник свяжется с вами в течение 1-2 рабочих дней.
Внимание!
Обнаружена ошибка.
Проверьте вашу почту
Проверьте вашу почту
Для завершения подписки перейдите по ссылке в письме, которое мы только что отправили. Если письма нет во «Входящих», проверьте папку «Спам».
MAX Подписаться
Уважаемые клиенты! Предупреждаем о случаях недобросовестной конкуренции и мошенничестве в сети Интернет.
Подробнее