我正在测试一个需要连接到服务器并保存其响应的测试应用程序。响应实际上是一个数据包,因此我需要了解它是什么类型并执行它。现在,我可以接收响应,计算数据包,现在我需要在需要的切换方法方面提供一些帮助获取数据包类型。

这是我正在使用的代码:

                    RPCPacket packet=null;
                    switch(RPCPacketType.getPacketTypeByValue(pType)){
                        case ST_OBJECT_TYPE_INFO_START:
                        {
                            packet = new InfoStartRPCPacket(    objectIdentificator,
                                                                RPCPacketType.getPacketTypeByValue(pType),
                                                                RPCOperationType.getByValue(Integer.parseInt(operation)),
                                                                objectId,
                                                                id,
                                                                Integer.parseInt(size),
                                                                hash,
                                                                RPCPacketDataType.getByValue(dataType),
                                                                first );
                            break;
                        }
                        case ST_OBJECT_TYPE_INFO_END:{
                            packet = new InfoEndRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_INFO_ERROR:{
                            packet = new InfoErrorRPCPacket();

                            break;
                        }
                            // Basic packets
                        case ST_OBJECT_TYPE_COLLECTION:{
                            packet = new CollectionRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_CATEGORY:{
                            packet = new CategoryRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_CARD:{
                            packet = new CardRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_MESSAGE:{
                            packet = new MessageRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_GENRE:{
                            packet = new GenreRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_TAG:{
                            packet = new TagRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_USER:{
                            packet = new UserRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_CARDSTATS_CATEGORY:{
                            packet = new CardStatsCategoryRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_CONTENT:{
                            packet = new ContentRPCPacket();

                            break;
                        }
                            // Media packets
                        case ST_OBJECT_TYPE_MEDIA_COLLECTION:{
                            packet = new MediaCollectionRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_MEDIA_CATEGORY:{
                            packet = new MediaCategoryRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_MEDIA_CARD:{
                            packet = new MediaCardRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_MEDIA_TAG:{
                            packet = new MediaTagRPCPacket();

                            break;
                        }
                        case ST_OBJECT_TYPE_MEDIA_COLLECTION_BUTTON:{
                            packet = new MediaCollectionButtonRPCPacket();

                            break;
                        }
                            // unknown packet
                        default: {
                            packet=null;

                            break;
                        }
                    }


在检查所有开关后,我需要一种能够将数据包初始化为InfoStartRPCPacket或其他方式的方法。基本上,我希望能够在外部开关上执行以下操作:

packet.executeInfoStartPacket(/*params*/);  , when executeInfoStartPacket is a method in InfoStartRPCPacket class.


有什么建议怎么做?

最佳答案

您不能真正做到这一点,也不应这样做。

相反,您可以在abstract类中称为RPCPacket的方法中使用一个process()方法(可能提供任何必要的上下文作为参数),并在每个特定的子类中重载该方法。

这样,特定于数据包的代码将自动访问所有特定于数据包的字段和方法。

09-10 06:18
查看更多