2012-07-31 49 views
1

我在我的表單中有一個屬性ProductName。編譯代碼時我收到警告。ProductName隱藏System.Windows.Forms.Control.ProductName

FormInventory.ProductName隱藏遺傳成員'System.Windows.Forms.Control.ProductName'。如果需要隱藏,請使用新關鍵字。下面

是我的代碼

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. 我目前在發展的初期,如果我隱藏這個屬性與new修改將有任何問題,因爲基本屬性Forms.Control.ProductName返回包含該控件的程序集的產品名稱。我的FormInventory.ProductName返回用戶輸入的值。

  3. 我們在哪裏使用這個Forms.Control.ProductName,因爲我以前從未使用過。

我已經搜查,發現了類似的問題

這些問題不解決我的問題,但在瞭解了警告事業幫助了我。

回答

1

是,只需使用new關鍵字,像public new string ProductName { get; set; }

2.沒有,它只是返回name of the assembly

3.它用於調試和一些「反射」。我說「反思」,因爲它更像是一種人爲的反思。

所以,這種方式是安全的。但是,你爲什麼不簡單地把它改成MyCompanyProductName

Regards

+0

我有一些六到七個屬性我的表單如果我單獨將這個屬性重命名爲MyCompanyProductName,它將導致我的表單中出現一些不一致的情況,並且還將公司名稱作爲所有屬性,它將是多餘的。但重命名是簡單的解決方案。就像@drumboog所說的那樣,它會減少混淆。感謝您的回答。 – krishnan 2012-07-31 05:37:18

+0

非常歡迎您 – 2012-07-31 05:39:07

1

使用'new'關鍵字將會禁止警告。當你做到這一點,稱產品名稱屬性的結果取決於用來引用的表單變量的類型...例如,如果你調用從另一個類的屬性:

// 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框架引用了Form類,而不是新類,因此不會影響.NET框架內就此屬性發生的任何事情。

但是,正如其他人所建議的,如果您能夠重新命名該屬性,可能會導致更少的混淆。

+0

感謝您的回答,幫助我瞭解這個「新」關鍵字的工作原理。 – krishnan 2012-07-31 05:47:39

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的博客提出的架構看起來不錯,但我相信它會通過你的員工是「視圖模型」的封裝方法來改善。

看一看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這樣的工具,這將減少上述代碼

+0

我已經更新了我的問題中的代碼。 ProductName屬性獲取並設置textbox的TextProduct的值。我的演示者將調用ProductName屬性來獲取和設置文本框的值。我目前正在關注這個[博客](http://cerquit.com/blogs/post/MVP-Part-I-e28093-Building-it-from-Scratch.aspx)中介紹的MVP風格。它對我來說簡單易懂。 – krishnan 2012-07-31 05:19:17

+0

謝謝nonnb。 ViewModel會很有幫助,就像你說如果我將所有的視野抽象到一個單獨的視圖模型中,我認爲從視圖控件(特別是'文本框')檢索和綁定數據會有問題。搜索後,我遇到了這篇文章(http://aviadezra.blogspot.in/2009/08/mvp-mvvm-winforms-data-binding.html)。我從來沒有想過'文本框'具有數據綁定屬性。現在我將使用viewmodel。我現在沒有使用automapper。再次感謝您的回答。 – krishnan 2012-07-31 12:55:34