C# 转换为设计界面
我们目前有一个登录结构,但我们想用另一个结构替换它。但是,我们希望保留这两种情况,以防新的结构不起作用 我们现在有什么 PasswordControl.csC# 转换为设计界面,c#,interface,C#,Interface,我们目前有一个登录结构,但我们想用另一个结构替换它。但是,我们希望保留这两种情况,以防新的结构不起作用 我们现在有什么 PasswordControl.cs public class PasswordControl { public passwordControl() { // code here } public doLogin() { // code here } } Main.cs provide void btnLogin()
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
接口,则该类包含publicdoLogin()
方法
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。。。什么?您是否在问如何实施战略模式?