2011-12-09 1 views
1

ここで、私はEditMyDataObjectプロパティを設定するベースフォームと、テキスト値を取得してその後に復元する拡張フォームで、Resharperの警告を受け取ります。これらの仮想メンバーコールは、コンストラクタの警告が正当なものですか?

どちらの場合でも、アプリケーションを実行すると何も吹き飛ばされません。私は、オーバーライドされたプロパティがコンストラクタで初期化されたものに依存しないため、実装された問題の可能性はないと考えていますが、Resharperを怒らせる前に第2意見を感謝します。

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

EDIT:wrong、thanks Daniel *必要に応じて、プロパティの代わりに基になる変数を設定して、最初の警告を削除できます。私はこれが良いアイデアであるかどうかについての意見はありません、私はちょうど言っています。* – jv42

+0

@ jv42:それは行動を変えるでしょう。 –

+0

@ vj42:私はそれを試みたと思うが、MyDataObjectExに変換されなかったので、MyDataObjectExEditFormがベースのMyDataObjectだけを渡したときに問題が発生した。 –

答えて

6

限り、各派生クラスは、それがその派生クラスのコンストラクタで初期化された変数に依存していないような方法でこの仮想メンバをオーバーライドするとして、あなたは安全です。問題は、基本クラスから派生するすべてのクラスがこのように動作することを知ることができないことです。そのため、警告は合法です。

+0

私はそれが将来的に物事をねじ込むことが可能であることを知っていた。公共の図書館ではないので、機能を失うことなく再設計することができなければ、危険は管理可能です。 –

関連する問題