我有一台设备我将要连接,并且该连接可以通过TCP / IP或串行连接。我正在编写一个模拟配置数据的类,其中一个配置选项是有关该连接的信息。
串行连接具有CommPort,BaudRate,Parity等配置设置.TCP / IP连接将具有主机和端口。
所以我很明显会有SerialConnectionInfo和TcpConnectionInfo类。但这些类是Equipment类的成员。
我似乎应该有一些主ConnectionInfo类或接口,但问题是虽然这两个类在概念上相似,但它们不共享任何公共字段。因此,以下内容似乎没有任何意义:
interface IConnectionInfo {
}
class SerialConnectionInfo : IConnectionInfo {
string CommPort;
}
class TcpConnectionInfo : IConnectionInfo {
string Host;
}
class Equipment {
IConnectionInfo Connection;
}
我可以做类似的事情,但是在某些时候我肯定要检查Connection是哪个类,并将其转换为正确的类。一切都闻错了。有没有人有任何想法?
答案 0 :(得分: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,因为它是关于设计而不是实现。
答案 1 :(得分:0)
除非TcpConnectionInfo
和SerialConnectionInfo
有共同之处,否则它没有多大意义。但是,如果他们这样做,那将更加明智,例如:
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
}
答案 2 :(得分:0)
您应该实现适配器模式并保持打开客户端使用TCP或Serialport连接到服务器的选项。