1

フォームにプロパティ ProductName があります。コードのコンパイル中に警告が表示されます。

FormInventory.ProductName継承されたメンバー ' を非表示にしSystem.Windows.Forms.Control.ProductName'ます。非表示が意図されている場合は、new キーワードを使用します。

以下は私のコードです

public partial class FormInventory : Form, IInventoryView
{
   public FormInventory()
   {
   } 

   public string ProductName
   {
      get { return this.textProductName.text; }
      set { this.textProductName.text = value; }
   }
}

textProductNameテキストボックスです。

私はそれProductNameが基本クラスのプロパティを隠していることを知っていますForms.Control.ProductName。私の質問は

  1. FormInventory.ProductNameプロパティの名前を変更せずに警告を抑制することは可能ですか

  2. 私は現在開発の初期段階にありますが、base プロパティはコントロールを含むアセンブリの製品名を返すnewため、このプロパティを修飾子で非表示にすると、製品リリース時に問題が発生する可能性があります。Forms.Control.ProductNamemyFormInventory.ProductName はユーザーが入力した値を返します。

  3. これまで使用したことがないため、これをどこで使用しますForms.Control.ProductNameか。

同様の質問を検索して見つけました

これらの質問は私の問題を解決しませんが、警告の原因を理解するのに役立ちました.

4

3 に答える 3

2

ProductName がフォームに表示するフォーム フィールドである場合、プロパティのすべてのフィールドを別の Product エンティティに抽象化してはどうでしょうか。これにより、アプリのメンテナンスが容易になります (そして、MVC / MVVM などのパターンに沿ったものになります)。

public class Product
{
     public string ProductName{ get; set; }
     public int ProductSize{ get; set; }
     // etc
}

public partial class FormInventory : Form
{
   public FormInventory()
   {
   } 

   public Product Product
   {
      get;
      set;
   }
}

編集 :

IMO、Rod Cerata のブログで提示されたアーキテクチャは問題ないように見えますが、従業員の「ViewModel」をカプセル化することで改善されると思います。

EmployeePresenter.cs を見てください。次のような反復的なスクレイピング コードがたくさんあります。

        _model.EmployeeID = _view.EmployeeID;
        _model.Lastname = _view.Lastname;
        _model.Firstname = _view.Firstname;
        _model.EmployeeType = _view.EmployeeType;
        _model.Salary = _view.Salary;
        _model.TAX = _view.TAX;

IMOは、新しいEmployeeViewModelクラスを作成することで改善されます(これは、EmployeeModelとほぼ同じで、タイトル、「モード」(編集、新規、読み取り専用など)などの「画面」固有のフィールドを加えてからツールを使用します) AutoMapper のように、上記のコードを削減します。

于 2012-07-31T05:03:21.040 に答える
1

1.はい、次のnewようなキーワードを使用するだけですpublic new string ProductName { get; set; }

2.いいえ、アセンブリの名前を返すだけです。

3.デバッグといくつかの「リフレクション」に使用されます。私は「反射」と言います。それは人間が作った反射に似ているからです。

したがって、この方法で進めるのは安全です。しかし、単にそれをに変更してみませんMyCompanyProductNameか?

よろしく

于 2012-07-31T04:58:37.010 に答える
1

'new'キーワードを使用すると、警告が抑制されます。これを行うと、ProductNameプロパティを呼び出した結果は、フォームを参照するために使用される変数のタイプによって異なります。たとえば、別のクラスからプロパティを呼び出している場合は、次のようになります。

// Notice that we're only creating one object and
// assigning it to two different variables.
FormInventory explicitlyNameForm = new FormInventory();
Form referenceToBaseForm = explicitlyNameForm;

// Acting on the child reference (FormInventory) will
// operate on YOUR implementation of ProductName
explicitlyNameForm.ProductName = "Some Value";

// But acting on the parent reference (Form) will
// operate on the .NET implementation of ProductName
referenceToBaseForm.ProductName = "Some Other Value";

最終結果はおそらくあなたが望むものになるでしょう...コンパイラはあなたが変数をどのように宣言したかに基づいてどの実装を使用するかを知っています。また、.NET Framework内のすべての参照は、新しいクラスではなくFormクラスを参照するため、このプロパティに関して.NETFramework内で発生するものに影響を与えるリスクはありません。

ただし、他の人が示唆しているように、プロパティの名前を変更できれば、混乱が少なくなる可能性があります。

于 2012-07-31T05:00:30.280 に答える