我的OOP方法似乎是错误的 - 必须检查类

本文关键字:检查 OOP 方法 似乎是 错误 我的 | 更新日期: 2023-09-27 18:35:43

我有一台设备要连接,该连接可能是通过TCP/IP或串行连接进行的。 我正在编写一个对配置数据建模的类,其中一个配置选项是有关该连接的信息。

串行连接具有配置设置,如CommPort,波特率,奇偶校验等。 TCP/IP 连接将具有主机和端口。

所以很明显,我将有SerialConnectionInfo和TcpConnectionInfo类。 但这些类是设备类的成员。

我似乎应该有一些主 ConnectionInfo 类或接口,但问题是,虽然这两个类在概念上相似,但它们不共享任何公共字段。 因此,如下所示似乎没有任何意义:

interface IConnectionInfo {
}
class SerialConnectionInfo : IConnectionInfo {
  string CommPort;
}
class TcpConnectionInfo : IConnectionInfo {
  string Host;
}
class Equipment {
  IConnectionInfo Connection;
}

我可以做这样的事情,但是在某些时候,我肯定必须检查 Connection 是哪个类,并将其转换为正确的类。 这一切都闻起来不对劲。 有人有什么想法吗?

我的OOP方法似乎是错误的 - 必须检查类

您使用对

实现不感兴趣的接口。因此,接口应提供一个由类实现的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 的东西,因为它是关于设计的,而不是实现的。

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

您应该实现适配器模式,并保持客户端使用 TCP 或串行端口连接到服务器的选项。