2010-10-14 99 views
1

我想知道是否有一種方法讓一個類的實例在運行時保留數據的同時訪問其父類的方法。 (這是否有意義?)C#從另一個文件訪問父類方法

如果有多個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

您的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構造函數讀取得很好,單例模式不適合你的需要,那麼有幾個ConnectorManager可以爲不同的comport配置實例化,是真的嗎?

+0

謝謝主席先生,這工作就像一個魅力! – mastofact 2010-10-14 21:24:08

1

您可以使searchchannel爲靜態。

閱讀關於它here

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


     } 
+0

對於這種情況,這不是一個單身嗎? – SamuelWarren 2010-10-14 20:13:15