C#从另一个文件访问父类方法

时间:2010-10-14 17:22:59

标签: c# class parent-child

我想知道是否有一种方法可以让类的实例访问其父类的方法,同时在运行时保留数据。 (这有意义吗?)

如果有多个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访问搜索通道,而不创建连接器管理器的新实例。

任何建议或帮助都非常感激。

3 个答案:

答案 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();
             }


         }