我想知道是否有一种方法可以让类的实例访问其父类的方法,同时在运行时保留数据。 (这有意义吗?)
如果有多个COM端口设置,我有一个ConnectionManager产生几个连接器(负责COM端口通信)。
file1.cs
namespace connector
{
public class connectormanager : idisposable
{
public connectormanager(comport1, comport2, retries, delay)
{
// create dictionary that maps COMPorts with devices
// **foreach spawn connector (if com port range is given)**
}
public searchchannel()
{
// search existing com ports
}
}
}
file2.cs
namespace connector
{
public class connector : idisposable
{
public void connector(port, retries, delay)
{
// there is a timer with a timeout event defined
}
// com port read/write operations
void _timer_Elapsed()
{
// **i want to access searchchannel**
// problem is if i create a new instance of connectionmanager
// i lose all the dictionary stuff
}
}
}
这两个文件都在同一个解决方案和项目下。我想要做的是从file2.cs中的_timer_Elapsed访问搜索通道,而不创建连接器管理器的新实例。
任何建议或帮助都非常感激。
答案 0 :(得分:3)
你的ConnectorManager对我来说就像一个工厂。您不应该单独调用Connector构造函数,而是在ConnectorManager类中添加CreateConnector函数
在这个工厂中,您将调用Connector构造函数,并将ConnectorManager实例传递给它。
连接器将存储此实例,并根据需要使用它。
public class ConnectorManager
{
public Connector CreateConnector()
{
return new Connector(comport1, comport2, retries, delay,this);
}
[...]
}
public class Connector
{
private ConnectorManager connectorManager;
internal Connector(int comport1, int comport2, int retries, int delay, ConnectorManager manager)
{
connectorManager = manager;
[...]
}
[...]
}
请注意,Connector构造函数是内部的,您不应该从程序集外部调用它。您不应该在不使用ConnectorManager.CreateConnector()
的情况下实例化连接器如果读取你的ConnectorManager构造函数,单例模式将不适合你的需要,可以为不同的comport配置实例化几个ConnectorManager,是真的吗?
答案 1 :(得分:1)
您可以searchchannel
静态。
了解它here。
答案 2 :(得分:1)
您可以将ConnectionManager作为Singleton对象,并且由于您的连接器类需要ConnectionManager的这种依赖关系,您可以通过属性注入注入它。
这是代码
public interface IConnectionManager
{
void searchchannel() ;
}
public class connectormanager : IDisposable , IConnectionManager
{
public static readonly connectormanager ConnectionManager = new connectormanager();
private connectormanager()
{
// create dictionary that maps COMPorts with devices
// **foreach spawn connector (if com port range is given)**
}
private void searchchannel()
{
// search existing com ports
}
void IConnectionManager.searchchannel()
{
searchchannel();
}
}
public class connector : IDisposable
{
IConnectionManager _manager = null;
public void connector(port, retries, delay)
{
}
private IConnectionManager myManager
{
get
{
return _manager;
}
set
{
myManager = connectormanager.ConnectionManager;
}
}
void _timer_Elapsed()
{
myManager.searchchannel();
}
}