Раздражающее дублирование в производных классах

В каждой форме, производной от FormBaseControl, у нас есть следующий код. Я уверен, что есть лучший способ ввести объект контроллера, чем этот, но на данный момент он включен на каждую страницу. В приведенном ниже примере base.Controller относится к типу BaseController, от которого происходит ExportController. Я обнаружил дублирование этого кода в каждом производном FormBaseControl, чтобы не пахнуть правильно, но я не могу понять, как это исправить.

    private ExportController MyController
    {
        get { return base.Controller as ExportController; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        base.Controller = new ExportController(WebNavigator.Current);
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
105
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, здесь есть проблема дизайна.

Вы уверены, что MyController должен быть ExportControler (или любым другим), а не базовым (или производным классом)? Могут ли этого избежать промежуточный класс, интерфейс или дженерики?

Расскажите, пожалуйста, зачем вам все время переопределять MyControler.

Здесь может быть проблема с дизайном, но я не собираюсь переделывать приложение с исходными файлами 13 КБ, которое в настоящее время развернуто для пользователей 5 КБ. :-( На странице экспорта мне нужен доступ к конкретным членам ExportController, которые недоступны в BaseController.

ProfK 03.12.2008 18:55
Ответ принят как подходящий

Разве вы не можете использовать универсальный класс, чтобы исправить это?

Т.е. вместо:

 private ExportController MyController
 {
        get { return base.Controller as ExportController; }
 }

в производном классе.

Помещать:

 protected T MyController
 {
        get { return this as T; }
 }

в базовом классе и превратите базовый класс в универсальный класс BaseController<T>

Я не могу изменить BaseController, чтобы он принимал параметр универсального типа.

ProfK 03.12.2008 18:58

Ах. Значит, ты запутался :) Ладно. А как насчет вставки промежуточного класса, производного от BaseController, который принимает общий. Тогда другие классы могут быть производными от этого.

Andrew Rollings 03.12.2008 18:59

Ваше решение, похоже, путает базу контроллера и базу страницы, потому что MyController на базовой странице должен возвращать контроллер. Если он вернет это, as T завершится ошибкой.

ProfK 03.12.2008 19:14

В таком случае мне пришлось бы увидеть более полный пример :).

Andrew Rollings 03.12.2008 20:28

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

ProfK 03.12.2008 20:33

Другие вопросы по теме