2017-07-18 31 views
0

背景:我正在尋找一種通用方法來實現Raspberry Pi物聯網愛好項目的標準功能,該項目通過串行通信與不同的硬件設備進行通信。設備通過返回他們使用的「協議版本」以及他們已經實現的協議的哪些命令組來識別他們自己。關於C#中接口和泛化設計的建議

實施例1:

  • Device1的: 「協議V1A」 組 「A,B」
  • 設備2: 「協議V2」 組 「A,C」
  • 設備3 :等等......

The basic在不同協議中支持的命令是相同的,但是對於不同的版本,他們期望不同的實現。

實施例2:

  • 協議V1A:

    • 命令組的:
      • 空隙sendAck(){SerialWrite(字節的0x0A);}
      • 空隙sendNak(){SerialWrite(字節0×00);}
  • 協議V2:

    • 命令組的:
      • 空隙sendAck(){SerialWrite(字節0x1A的);}
      • void sendNak(){SerialWrite(byte 0x10);}

目標:我的目標是能夠運行應用程序的覆盆子PI連接到隨機設備中的一個和接收的協議版本之後並支撐從所述裝置的命令組創建必要的代碼中的對象。

到目前爲止我所取得的成果如下: 與設備的串行通信正常工作。我知道不同的命令,但希望使其更通用和靈活。因此,對於命令的基本定義,我創建了一個接口定義。

interface IDeviceProtocol 
{ 
    // Group a commands 
    void sendAck(); 
    void sendNak(); 

    // Group b commands 
    void someOtherCommand(); 
} 

通過這樣做我可以使用接口定義並實現每個協議所需的命令。

class ProtocolV1a: IDeviceProtocol 
{ 
    // Explicit interface member implementation: 
    void IDeviceProtocol.sendAck() 
    { 
     SerialWrite(byte 0x0A); 
    } 

    // Explicit interface member implementation: 
    void IDeviceProtocol.sendNak() 
    { 
     SerialWrite(byte 0x00); 
    } 

    static void Main() 
    { 
     // Some protocol specific code here. 
    } 
} 

現在我應該可以在我的主程序中使用下面的代碼來調用特定於協議的類。它是否正確?

IDeviceProtocol Device1 = new ProtocolV1a(); 
Device1.sendAck(); 

,或者如果它是一個V2協議設備:

IDeviceProtocol Device2 = new ProtocolV2(); 
Device2.sendAck(); 

問: 是否有可能有某種枚舉列表中所有列出的可能的協議版本。並根據設備返回的協議版本創建具有正確協議類的設備類?

事情是這樣的:

// returns the protocol used by the device  
    EnumProtocols pversion = ReceiveProtocol(); 

    IDeviceProtocol genericDevice = new IDeviceProtocol(pversion); 

    genericDevice.sendAck(); 

請問這種方法有一個名字,所以我可以看看那個,學會如何做到這一點? 你能給我一些指針,從哪裏開始尋找,或者可能是一些示例代碼?

回答

0

我認爲你正在尋找的是工廠設計模式。

像這樣的事情可能實現自己的目標:

public enum Protocol 
{ 
    Version1, 
    Version1A, 
    Version2 
} 

public IDeviceProtocol CreateDeviceProtocol(Protocol protocol) 
{ 
    switch protocol 
    { 
     case Protocol.Version1: 
      return new Device1(); 
      break; 
     case Protocol.Version1A: 
      return new Device1A(); 
      break; 
     case Protocol.Version2: 
      return new Device2(); 
      break; 
     default: 
      //throw some error 
    } 
} 
+0

謝謝你指點我到正確的方向。這確實是我一直在尋找的東西。此外,我已經在工廠設計模板的深入說明中找到了此參考:https://msdn.microsoft.com/en-us/library/ee817667.aspx – Heersert