2010-10-14 21 views
1

Je me demandais s'il existait un moyen pour une instance d'une classe d'accéder aux méthodes de sa classe parente tout en préservant les données pendant l'exécution. (Est-ce que cela avait un sens?)Méthodes d'accès par classe parent C# à partir d'un autre fichier

J'ai un ConnectionManager qui engendre plusieurs Connecteurs (qui est en charge des communications du port COM) s'il y a une configuration de port COM multiple.

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

Les deux fichiers sont sous la même solution et projet. ce que je veux faire est d'accéder au canal de recherche de _timer_Elapsed dans file2.cs sans créer une nouvelle instance du gestionnaire de connecteurs.

Tout conseil ou aide grandement apprécié.

Répondre

3

Votre ConnectorManager ressemble à une usine pour moi. Vous ne devez pas appeler le constructeur Connector à proprement parler, mais plutôt ajouter une fonction CreateConnector dans la classe ConnectorManager

Dans cette fabrique, vous appelez le constructeur Connector et lui transmettez l'instance ConnectorManager.

Le connecteur stockera cette instance et l'utilisera au besoin. Notez que le constructeur Connector est interne, vous ne devriez pas l'appeler de l'extérieur de votre assembly. Vous ne devez JAMAIS instancier un Connecteur sans utiliser ConnectorManager.CreateConnector()

Si un constructeur ConnectorManager a bien lu, le modèle singleton ne vous convient pas, plusieurs ConnectorManager peuvent être instanciés pour différentes configurations de portage, est-ce vrai?

+0

Merci monsieur, cela a fonctionné comme un charme! – mastofact

1

Vous pouvez rendre searchchannel statique.

En savoir plus here.

1

Vous pouvez faire de ConnectionManager un objet Singleton et puisque votre classe de connecteur requiert cette dépendance de ConnectionManager, vous pouvez l'injecter via l'injection de propriété.

est ici le code

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


     } 
+0

Ce singleton n'est-il pas un peu trop pour ce scénario? – SamuelWarren