所以我有一个抽象类
public abstract class Client
{
public abstract void Send();
public abstract void Get();
}
现在有两个类继承自Client
public class ClientV2 : Client
{
public string Value1 {get;set;}
//implement Send and Get method()
}
public class ClientV3 : Client
{
public string Value2 {get;set;}
public string Value3 {get;set;}
//implement Send and Get method()
}
为简单起见,Program类是通用的GUI类。现在,当有人点击复选框时,一个新的对象将被实例化,但也会显示新的控件,例如值2的文本框。我需要做的是设置一个Value2当有人会输入一些东西,但由于我使用抽象类型,我无法访问该值,你认为什么将是这里的最佳解决方案?public class Program
{
private Client client;
public void Client2CheckboxChecked()
{
client = new Client2();
}
public void Client2CheckboxChecked()
{
client = new Client3();
}
public void Value2Changed(string newValue)
{
//Here I would need to set Value2 propertyu of a ClientV3 using client
}
public void SendData()
{
client.Send();
}
}
我当然可以为客户端2和客户端3创建一个不同的类型,而不是
private Client client;
我将有
private ClientV3 clientV2;
private ClientV3 clientV3;
但是将来也有可能出现clientV4,我想尽量减少我需要在Program类中更改的更改量。
您可以创建一个抽象方法SetValue
,所有不同的客户端都必须实现它,并且实际的逻辑在其中。然后在Program.Value2Changed
中调用这个方法:
public void Value2Changed(string newValue)
{
client.SetValue(newValue); // may be ClientV2 or ClientV3 or whatever
}
class Client
{
public abstract void SetValue(string newValue);
}
class ClientV2 : Client
{
public override void SetValue(string newValue) => this.Value2 = newValue;
}
class ClientV3 : Client
{
public override void SetValue(string newValue) => this.Value3 = newValue;
}
将设置Program
值的任务委托给Client
。
由于父类无法知道继承类中的内容,因此可以使用向下转换来解决此问题。
public void Value2Changed(string newValue)
{
(ClientV3)client.Value2 = newValue;
}