Вызов виртуального члена в конструкторе

В моем приложении я использую одну и ту же winform в разных контекстах для управления видимостью кнопок, включения текстовых полей и текста заголовка winform. Я решил сделать это, просто передав строку в конструктор формы и проверив ее с помощью пары операторов if, которые, в свою очередь, содержат желаемые настройки winform.

if (formContext == "add")
{
    Text = "Add member";
}
if (formContext == "edit")
{
    Text = "Change role";
    userTextBox.Enabled = false;
    searchButton.Visible = false;
}

Это работает нормально, однако ключевые слова «Текст» получают синюю волнистую линию, добавленную ReSharper со следующим сообщением: Вызов виртуального члена в конструкторе. Это потенциальная проблема или просто какое-то излишне восторженное сообщение ReSharper.

Будем очень признательны за любые разъяснения или предложения по улучшению моей реализации.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
3 493
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вызов виртуального члена в ctor базового класса мог вызывает выполнение некоторой логики в подклассе до того, как вызывается ctor подкласса (и, таким образом, до того, как объект получит возможность инициализировать себя до согласованного состояния).

Это просто приятное напоминание, чтобы вы знали, что делаете что-то, что потенциально может вызвать неприятное неожиданное поведение.

Да ... об этом я и сам думал. Любые предложения относительно того, как я мог бы сделать это лучше. Стабильность - приоритет номер один в этом проекте, и я бы предпочел избегать возможного неожиданного поведения.

Sakkle 19.01.2009 16:02

Вы имеете в виду предложения помимо того, что просто не вызываете виртуальные методы в вашем базовом классе ctor? :-) В этой ситуации вы можете использовать привязку данных для привязки свойства Text формы к строковому полю в классе модели GUI, которое затем будет содержать необходимую логику для определения того, что должна говорить строка заголовка.

mookid8000 19.01.2009 16:10

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

Sakkle 19.01.2009 16:48

В дополнение к существующим ответам для форм вы можете добавить обработчик события Load:

Load += delegate
{
    if (formContext == "add")
    {
        Text = "Add member";
    }
    if (formContext == "edit")
    {
        Text = "Change role";
        userTextBox.Enabled = false;
        searchkButton.Visible = false;
    }
};

Это кажется самым простым и лучшим решением того, что я пытаюсь выполнить, без необходимости переписывать много кода. Да ... мне лень: P

Sakkle 19.01.2009 16:46

Я бы посоветовал вам переписать класс следующим образом:

public partial class Form1 : Form
{
    public enum FormContextMode
    {
        Add,
        Edit
    }

    private FormContextMode m_mode = FormContextMode.Add; 

    public Form1( FormContextMode mode )
    {
        InitializeComponent();
        m_mode = mode;
        Load += delegate { UpdateForm(); };
    }

    private void UpdateForm()
    {
        if ( m_mode == FormContextMode.Add )
        {
            Text = "Add member";    
        }
        else if ( m_mode == FormContextMode.Edit )
        {
            Text = "Change role";
            userTextBox.Enabled = false;
            searchkButton.Visible = false;
        }
    }
}

Вам не нужно подписываться на собственное событие Load, просто переопределите метод OnLoad.

Ilya Ryzhenkov 19.01.2009 18:17

Да, я согласен с Ильей - лучше перегрузить метод, тогда вам не нужно будет помнить об отказе от подписки на событие + (и это интуитивное заявление), вероятно, быстрее.

ng5000 19.01.2009 19:07

Не создавайте «второй ответ», это просто сбивает с толку. Этот ответ сам по себе не соответствует требованию «Любые разъяснения или предложения по улучшению» в вопросе.

bzlm 26.01.2009 11:13

Исходный ответ удален и заменен этим, обновленным, как показано.

ng5000 27.01.2009 14:39

Просто запечатайте свой класс.

msdn.microsoft.com/en-us/library/88c54tsw(VS.71).aspx Запечатанный класс не может быть унаследован, поэтому нет возможности, чтобы производный класс переопределил виртуальный член.
ng5000 19.01.2009 19:41

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