C++ C++;具有多态性的类设计

C++ C++;具有多态性的类设计,c++,design-patterns,polymorphism,c++14,C++,Design Patterns,Polymorphism,C++14,我正在做一些网络方面的事情,但问题与网络无关。我有一个通用的网络事件处理程序,在这里我可以注册一个网络连接(“NwConnection”类),只要有消息到达连接,它就会给我回电话 class NwEventManager { public: using CallBack = std::function<void(std::shared_ptr<NwConnection>)>; registerCallback( std::shar

我正在做一些网络方面的事情,但问题与网络无关。我有一个通用的网络事件处理程序,在这里我可以注册一个网络连接(“NwConnection”类),只要有消息到达连接,它就会给我回电话

class NwEventManager {
public:

    using CallBack = std::function<void(std::shared_ptr<NwConnection>)>;

    registerCallback(
           std::shared_ptr<NwConnection> con,            
            CallBack rdCallback,
            CallBack errorCallBack);
};
在回调中,它将使用NwConnection抽象类调用我,我静态地将指针转换为我的类型并访问stats

// read callback

[] (std::shared_ptr<NwConnection> con)
{
     auto myConn = static_cast<MyNwConnection *>(con.get());

     auto& stats = myConn->getStats();   
}
现在我可以进行静态转换,连接类型无关紧要


但是,在允许应用程序保留每个连接的数据的同时,还有什么更好的设计方法呢?(我可以自由重写代码的任何部分。)

如果您的代码如您所示按预期工作,并且您正在寻找改进的方法,您应该将其发布在。请确保在询问之前检查它。在获取具体类型和检查null时,通常会使用动态强制转换。然而,我认为你应该设计这样的东西,不需要浇铸到混凝土类型。从接口继承GetStats作为纯虚拟的,并在具体类中实现它。除非每个具体的网络类类型也有不同的统计类型…@ChristopherPisz,统计只是一个类的要求。因为NwConnection是一个泛型类,不同类型的应用程序都希望使用它。每个具体的类都希望在连接中保留自己的数据类型。@MGH在这种情况下,我看不到可以替代您已有的数据类型。我也会这样做。我会使用第二种方法——用流接口创建一个单独的类来进行统计、排序或包装。在本例中,您将统计计数与实际数据传输代码分离。您可以将其保存在
NwEventManager
中-将通用接口作为参数,用stats counting类包装并保存它。由于
NwEventManager
将创建包装器,因此它可以将其存储为具体类型。
// read callback

[] (std::shared_ptr<NwConnection> con)
{
     auto myConn = static_cast<MyNwConnection *>(con.get());

     auto& stats = myConn->getStats();   
}
class TcpStream : public AbstractStream {}
class UnixStream : public AbstractStream {}

class NwConnection {

    Message read (...)
    {
        return stream->read(...);
    }

private:
    AbstractStream *stream;
};