使用引用抽象类型设置子类型类的属性



所以我有一个抽象类

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;
}

相关内容

  • 没有找到相关文章

最新更新