【问题标题】:My OOP Approach Seems Wrong - Having to Check Class我的 OOP 方法似乎是错误的 - 必须检查类
【发布时间】:2014-12-29 13:28:51
【问题描述】:

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

串行连接具有 CommPort、BaudRate、奇偶校验等配置设置。TCP/IP 连接将具有主机和端口。

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

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

interface IConnectionInfo {
}

class SerialConnectionInfo : IConnectionInfo {
  string CommPort;
}

class TcpConnectionInfo : IConnectionInfo {
  string Host;
}

class Equipment {
  IConnectionInfo Connection;
}

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

【问题讨论】:

  • 这取决于您将如何以及在何处使用这些配置设置 - 您可以将 Configure() 方法添加到 IConnectionInfo 以便 TcpConnectionInfo 可以使用它自己知道的内部设置跨度>

标签: c# oop data-structures


【解决方案1】:

您使用对实现不感兴趣的接口。所以接口应该提供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 的东西,因为它是关于设计而不是实现。

【讨论】:

  • 谢谢。我已经走这条路了,但是我最初计划将这个类纯粹用作对象模型,并且将有其他类来建立连接等。也许这最好的方法。
  • 如果你只是想让一个愚蠢的类包含特定于连接类型的属性,那么我认为你不能在上面放置一个共享接口,因为它们......不共享属性(就像你发现)。
  • 这种方法将 howwhat 分离。对于任何需要了解其内部结构的代码,您仍然可以将套接字和串行连接类用作“哑”数据容器。但是客户端/消费代码应该不需要需要了解这些内部信息——如果是这样,你就违反了single responsibility principle
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 2023-03-29
      • 1970-01-01
      • 2021-08-16
      • 2020-04-04
      • 2019-01-17
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      相关资源
      最近更新 更多