C # доступ к методам родительского класса из другого файла - PullRequest
1 голос
/ 14 октября 2010

Мне было интересно, существует ли способ для экземпляра класса получить доступ к методам (методам) своего родительского класса при сохранении данных во время выполнения.(Это имело какой-то смысл?)

У меня есть ConnectionManager, который порождает несколько коннекторов (отвечающих за связь через COM-порт), если есть настройка нескольких 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
  }
}
}

оба файла находятся под одним решением и проектом.я хочу получить доступ к поисковому каналу из _timer_Elapsed в file2.cs без создания нового экземпляра диспетчера соединителей.

Любой совет или помощь, которые очень ценятся.

Ответы [ 3 ]

3 голосов
/ 14 октября 2010

Ваш ConnectorManager выглядит как фабрика для меня.Вы не должны вызывать конструктор Connector отдельно, а должны добавить функцию CreateConnector в классе ConnectorManager

. На этой фабрике вы будете вызывать конструктор 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 является внутренним, его не следует вызывать извне сборки.Вы НИКОГДА не должны создавать экземпляр Connector без использования ConnectorManager.CreateConnector ()

Если вы хорошо прочитали ваш конструктор ConnectorManager, шаблон синглтона не подойдет вам, если несколько ConnectorManager могут быть созданы для другой конфигурации компилятора, если этоправда?

1 голос
/ 14 октября 2010

Вы можете сделать 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();
             }


         }
1 голос
/ 14 октября 2010

Вы можете сделать searchchannel статичным.

Читайте об этом здесь .

...