2014-12-29 14 views
3

我有一臺設備要連接到,並且該連接可能是TCP/IP或串行連接。我正在編寫一個模擬配置數據的類,其中一個配置選項是關於該連接的信息。我的面向對象方法似乎錯了 - 必須檢查類

串行連接具有像CommPort,BaudRate,Parity等配置設置。TCP/IP連接將具有主機和端口。

所以看來很明顯,我將要有Seri​​alConnectionInfo和TcpConnectionInfo類。但是這些類是設備類的成員。

我似乎應該有一些主ConnectionInfo類或接口,但問題是,雖然這兩個類在概念上相似,但它們不共享任何公共字段。因此,像下面似乎沒有任何意義:

interface IConnectionInfo { 
} 

class SerialConnectionInfo : IConnectionInfo { 
    string CommPort; 
} 

class TcpConnectionInfo : IConnectionInfo { 
    string Host; 
} 

class Equipment { 
    IConnectionInfo Connection; 
} 

可以做這樣的事情,但後來在某一點上,我肯定會要檢查哪個類連接是和將它投射到適當的班級。這一切都錯了。有人有任何想法嗎?

+0

它取決於你將如何以及在哪裏使用這些配置設置 - 你可以在IConnectionInfo中添加一個Configure()方法,這樣TcpConnectionInfo就可以使用它自己的內部設置瞭解 – Rhumborl

回答

6

您可以使用對實現不感興趣的接口。所以界面應該提供一個Connect()方法,這個方法由類實現。

然後,這些類包含該特定連接類型所需的屬性。像這樣TcpConnection

public interface IConnection 
{ 
    void Connect(); 
} 

public class TcpConnection : IConnection 
{ 
    public string Host { get; private set; } 
    public int Port { get; private set; } 

    private Socket _socket; 

    public TcpConnection(string host, int port) 
    { 
     Host = host; 
     Port = port; 
    } 

    public void Connect() 
    { 
     _socket = new Socket(...); 
    } 
} 

然後,您可以實例化它:

IConnection connectionInfo = new TcpConnection("example.com", "1337"); 

,並通過它作爲一個接口,調用它Connect()連接。

你的問題沒有包含足夠的信息,究竟什麼類,接口或屬性應該做什麼,所以我不能真正建模我的答案。此外,這看起來更像是http://programmers.stackexchange.com,因爲它是關於設計而不是實現。

+0

謝謝。我沿着這條路走下去了,但是我原本打算純粹將這個類用作對象模型,並且將會有其他類來建立連接等。也許這*是最好的辦法。 – Dave

+0

如果你只是想要一個愚蠢的類來包含連接類型特定的屬性,那麼我不認爲你可以把一個共享接口,因爲他們......不共享屬性(就像你發現的)。 – CodeCaster

+1

這種方法將* how *與* what *分離開來。對於任何需要了解其內部結構的代碼,您仍然可以使用套接字和串行連接類作爲「啞」數據容器*。但客戶端/消費代碼應該不需要知道這些內部信息 - 如果它違反了[單一責任原則](http://en.wikipedia.org/wiki/Single_responsibility_principle)。 – David

0

除非TcpConnectionInfoSerialConnectionInfo有共同之處,否則沒有多大意義。但是,如果他們這樣做,那將是更明智的,例如:

interface IConnectionInfo { 
    public string GetConnectionSocketDescription(); 
    public void Connect(); 
    // etc 
} 

class SerialConnectionInfo : IConnectionInfo { 
    string CommPort; 
    // make GetConnectionSocketDescription return CommPort 
    // make Connect work for serial connection 
} 

class TcpConnectionInfo : IConnectionInfo { 
    string Host; 
    // make GetConnectionSocketDescription return Host 
    // make Connect work for TCP connection 
} 
0

你應該實現適配器模式,並保持打開客戶端的選項連接到服務器或者使用TCP或的SerialPort。

相關問題