C# 转换为设计界面

C# 转换为设计界面,c#,interface,C#,Interface,我们目前有一个登录结构,但我们想用另一个结构替换它。但是,我们希望保留这两种情况,以防新的结构不起作用 我们现在有什么 PasswordControl.cs public class PasswordControl { public passwordControl() { // code here } public doLogin() { // code here } } Main.cs provide void btnLogin()

我们目前有一个登录结构,但我们想用另一个结构替换它。但是,我们希望保留这两种情况,以防新的结构不起作用

我们现在有什么

PasswordControl.cs

public class PasswordControl
{
   public passwordControl()
   {
      // code here
   }
   public doLogin()
   {
      // code here
   }
}
Main.cs

provide void btnLogin()
{
  passwordControl pw = new passwordControl();
  pw.doLogin();
}
我们希望将其转换为设计结构

IloginManager.cs

Interface ILoginManager 
{
  void dologin();
}
因此,我们还可以添加第二个结构

PasswordControl2.cs

public class PasswordControl2
{
   public passwordControl()
   {
      // code here
   }
   public doLogin()
   {
      // code here
   }
}

我需要如何修改Main.cs中的代码以利用这种新设计?

要利用接口,首先让每个实现都从中派生出来。然后在客户端代码中,将其存储为接口类型:

ILoginManager login = new PasswordControl();
//Do stuff with login
如果决定使用其他实现,只需切换实例化的内容:

ILoginManager login = new PasswordControl2();
//Do stuff with login

后续的代码仍然可以,因为您仍然通过
ILoginManager
接口访问该类。在生产代码中,接口通常只由调用堆栈上的某个类或DI容器传递给您。

您希望在运行时在同一契约的不同实现之间切换,这就是您希望使用接口的原因。接口是一个契约:如果某个类实现了某个接口,它将提供该接口中定义的服务。如果任何类实现了
ILoginManager
接口,则该类包含public
doLogin()
方法

public interface ILoginManager 
{
    void doLogin();
}

public class PasswordControl : ILoginManager
{
   public PasswordControl()
   {
      // code here
   }
   public void doLogin()
   {
      // code here
      Debug.WriteLine("PasswordControl.doLogin()");
   }
}

public class PasswordControl2 : ILoginManager
{
   public PasswordControl2()
   {
      // code here
   }
   public void doLogin()
   {
      // code here
      Debug.WriteLine("PasswordControl2.doLogin()");
   }
}
您说过要在创建表单时确定ILoginManager的实现。例如,表单可以从配置文件中读取选项。这意味着您不必在想要更改契约实现时重新编译程序,只需更改配置文件并重新启动程序即可

您的表单可以具有以下构造函数:

public class MyForm
{
   ILoginManager _loginManager;

   public MyForm()
   {
      // let's assume read value is 2
      int choice = ReadChoiceFromConfigFile();

      if (choice == 1)
      {
         _loginManager = new PasswordControl();
      }
      else
      {
         _loginManager = new PasswordControl2();
      }
   }
}
因此,当您按下登录按钮时,将使用正确的实现:

private void btnLogin()
{
   // in our case PasswordControl2.doLogin() is called as _choice has been set to 2
   _loginManager.doLogin();
}
如果将创建适当的
LoginManager
的责任从
MyForm
中移除,那就更好了,因为表单不应该知道它的详细信息-它想要得到的只是一个实现
ILoginManager
的对象,但它不应该关心它是如何创建的。因此,理想情况下,您将在创建表单之前创建
ILoginManager
implementer,然后将其作为表单的依赖项传递(例如,您将通过构造函数“注入”它;请阅读相关内容)。看起来是这样的:

public class MyForm
{
   ILoginManager _loginManager;

   public MyForm(ILoginManager loginManager)
   {
      if (loginManager == null)
      { 
         throw new ArgumentNullException("loginManager");
      }

      _loginManager = loginManager;
   }
} 

public static void Main()
{
   ILoginManager loginManager = CreateLoginManager();
   Application.Run(new MyForm(loginManager));
}

// factory method - it creates desired instance which implements given interface
public static CreateLoginManager()
{
   ILoginManager loginManager = null;

   // let's assume read value is 2
   int choice = ReadChoiceFromConfigFile();

   if (choice == 1)
   {
       loginManager = new PasswordControl();
   }
   else
   {
       loginManager = new PasswordControl2();
   }

   return loginManager;
}  

你做了什么?这是ASP、winforms、WPF吗?你的密码控制必须实现ILoginManager接口。它将是win FormsUmmm。。。什么?您是否在问如何实施战略模式?