Являются ли эти предупреждения Virtual Member Call in Constructor допустимыми? - PullRequest
1 голос
/ 09 декабря 2011

Здесь я получаю предупреждения Resharper в базовой форме, где я устанавливаю свойство EditMyDataObject, и в расширенной форме, где я беру текстовое значение и затем восстанавливаю его.

В обоих случаях при запуске приложения ничего не взрывается. Я не думаю, что есть какие-то потенциальные проблемы для реализации, потому что мое переопределенное свойство не зависит от чего-либо, инициализированного в конструкторе, но было бы признательно за 2-е мнение, прежде чем заткнуть Resharper.

public class MyDataObject
{
    //Data Members

    public MyDataObject()
    {
    }
}

public class MyDataObjectEx : MyDataObject
{
    //Data Members

    public MyDataObjectEx()
    {
    }

    public MyDataObjectEx(MyDataObject myDataObject)
    {
    }       
}

public partial class MyDataObjectEditFrm : Form
{
    private MyDataObject _myDataObject;

    protected virtual MyDataObject EditMyDataObject
    {
        get { return _myDataObject; }
        set { _myDataObject = value; }
    }

    /// <summary>
    /// Parameterless constructor needed for designer support of derived classes.
    /// </summary>
    protected MyDataObjectEditFrm()
    {
        InitializeComponent();
    }

    protected MyDataObjectEditFrm(MyDataObject myDataObject)
    {
        InitializeComponent();
        EditMyDataObject = myDataObject;  // Warning: Virtual member call in a constructor

        Text = GetDialogNameFromInputParameters()

        //Remainder of initialization here
    }

    GetDialogNameFromInputParameters()
    {
        //Figure out what the text should be
    }
}


public partial class MyDataObjectExEditFrm : MyDataObjectEditFrm
{
    private MyDataObjectEx _myDataObjectEx;

    protected override MyDataObject EditMyDataObject
    {
        get { return _myDataObjectEx; }
        set
        {
            if (value == null)
                _myDataObjectEx = null;
            else _myDataObjectEx = value as MyDataObjectEx ?? new MyDataObjectEx(value);
        }

    }

    public MyDataObjectExEditFrm(MyDataObject myDataObject) : base(myDataObject)
    {
        //preserve the value computed and set in the base class to prevent the generic form name from the designer overriding it here
        string dialogText = Text; // Warning: Virtual member call in a constructor
        InitializeComponent();
        Text = dialogText; // Warning: Virtual member call in a constructor


        //Remainder of additional initialization for extended data here
    }
}

1 Ответ

6 голосов
/ 09 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...