2016-08-22 147 views
1

我有一个表单,我做了一些验证。当我实例化表单时,我传递一个类作为参数,然后我可以更新该类的值。传递类作为参数

Bussines _bussines = new Bussines(); 

public frmUsuario(Bussines b) 
{ 
    _bussines = b; 
    InitializeComponent(); 
} 

实例化形式

frmUsuario fUsuarios = new frmUsuario(this); 
fUsuarios.ShowDialog(); 

所以,我的问题是:根据OOP,它是确定做什么?这对我来说似乎很懒,但我不知道更简单的选择。有更好的选择吗?

对不起,我的英语,它不是我的母语。

+3

的'Bussines _bussines =新Bussines();'可以只是'Bussines _bussines;'如果你没有任何其他的构造函数不设置价值到'_bussines'。不需要两次创建对象。 –

+0

此外,这是WPF还是Winforms?如果它是WPF,那么有更好的方法可以将它传递给构造函数。 –

+0

谢谢你,我已经改变了我的代码。这是winforms。我想我应该在问题上添加标签 – Vlocks

回答

2

清洁和更间接的方式是使用接口。

IMO

  • 窗体构造函数不应该依赖于一个参数
  • 的形式应该是能够在没有任何特定的(Businees)显示
  • 您的形式应该表现出根据一个很好的UX其状态

但是正如其他人聪明地指出的,任何事情都可能是正确的,更重要的是不设置tra通过这样的限制将来对你自己。

实施例:

using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public class Business 
    { 
    } 

    public interface IBusinessHandler 
    { 
     Business Business { get; set; } 
     void Execute(); 
    } 

    public partial class Form1 : Form, IBusinessHandler 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     #region IBusinessHandler Members 

     public Business Business { get; set; } 

     public void Execute() 
     { 
      // check that we can continue 
      if (Business == null) 
      { 
       MessageBox.Show("Business property not set"); 
       // or whatever else appropriate 
       return; 
      } 

      // do some work on it 
      var s = Business.ToString(); 
      MessageBox.Show("Work done !"); 
     } 

     #endregion 
    } 

    internal class Demo 
    { 
     public Demo() 
     { 
      IBusinessHandler handler = new Form1(); 
      handler.Business = new Business(); 
      handler.Execute(); 
     } 
    } 
} 
+0

你真的需要这个界面吗?只要公开财产,你就完成了。 – ja72

+0

没错,我的意思是我们可以在这方面进行无休止的辩论;我的例子只是我脑海中出现的第一件事:) – Aybe

+0

如果你有多个表单与'Business'类交互并且你想要一个共同的'API',那么这将是有意义的。 – ja72

1

答案是否定的,因为.NET代码期望的形式的参数构造。

想想你如何使用OpenFileDialog。您创建一个实例,然后分配属性。这里也是一样。

{ 
    Business item=new Business() { Name="Yoko" }; 
    // 
    BusinessForm dlg=new BusinessForm(); 
    dlg.Business=item; 
    if (dlg.ShowDialog()==DialogResult.OK) 
    { 
     item=dlg.Business; 
    } 
} 

与表单代码

public class Business 
{ 
    public string Name { get; set; } 
    public bool IsOk { get { return !string.IsNullOrEmpty(Name); } } 
} 

public partial class BusinessForm : Form 
{ 
    Business business; 

    public BusinessForm() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     this.business=new Business(); 
    } 

    public Business Business 
    { 
     get { return business; } 
     set { business=value; } 
    } 
    public bool IsOk { get { return business.IsOk; } } 
}