繁体   English   中英

我的OOP方法似乎错了 - 必须检查班级

[英]My OOP Approach Seems Wrong - Having to Check Class

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

串行连接具有CommPort,BaudRate,Parity等配置设置.TCP / IP连接将具有主机和端口。

所以很明显我将要有Seri​​alConnectionInfo和TcpConnectionInfo类。 但这些类是Equipment类的成员。

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

interface IConnectionInfo {
}

class SerialConnectionInfo : IConnectionInfo {
  string CommPort;
}

class TcpConnectionInfo : IConnectionInfo {
  string Host;
}

class Equipment {
  IConnectionInfo Connection;
}

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

您可以使用您对实现不感兴趣的界面。 因此接口应该提供一个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或Serialport连接到服务器的选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM