我正在尝试将Objective C代码转换为Java,但是在理解如何实现方面存在一些问题。
这是Objective C代码:
+ (StPacket *)initialize:(UInt32)aPacketId packetType:(StPacketType)aPacketType operationType:(StOperationType)aOperationType
objectOid:(NSString*)aObjectOid objectId:(UInt32)aObjectId dataSize:(UInt32)aDataSize dataHash:(NSString*)aDataHash
dataType:(StPacketDataType)aDataType packetData:(NSData*)aPacketData {
StPacket * packet = nil;
switch (aPacketType)
{
// Special packets
case ST_OBJECT_TYPE_INFO_START:
{
packet = [[StPacketInfoStart alloc] init];
break;
}
case ST_OBJECT_TYPE_INFO_END:
{
packet = [[StPacketInfoEnd alloc] init];
break;
}
}
if (packet)
{
[packet setPacketData:aPacketId packetType:aPacketType operationType:aOperationType objectOid:aObjectOid objectId:aObjectId
dataSize:aDataSize dataHash:aDataHash dataType:aDataType packetData:aPacketData];
}
return [packet autorelease];
}
StPacketInfoStart init:
- (id)init {
self = [super init];
if (self)
{
locale = nil;
serverApiVer = nil;
deviceId = 0;
}
return self;
}
所以我是这样用Java实现的:
public RPCPacket( int apacketId,
RPCPacketType apacketType,
RPCOperationType aoperationType,
String[] aobjectOid,
int aobjectId,
int adataSize,
String[] adataHash,
RPCPacketDataType adataType){
RPCPacket packet=null;
switch(apacketType){
case ST_OBJECT_TYPE_INFO_START:
{
packet = new InfoStartRPCPacket();
break;
}
case ST_OBJECT_TYPE_INFO_END:
{
packet = new InfoEndRPCPacket();
break;
}
}
packet = new RPCPacket(adataSize, apacketType, aoperationType, adataHash, adataSize, adataSize, adataHash, adataType);
}
我的问题是,这是正确的方法,并且如果Java中的代码执行的功能与目标C中的功能相同,因为现在我遇到错误,即“对于默认构造函数,Implicit超级构造函数RPCPacket()未定义。必须定义一个显式构造函数”。
有任何想法吗?
最佳答案
我不会讲Objective-C,但是我可以肯定您不会做同样的事情,因为Java代码不正确:
从错误消息(和名称)中,我认为您的RPCPacket
“方法”是构造函数。如果您希望每当有人将new RPCPacket()
与适当的参数一起使用时调用它,就可以了。
但是在构造函数的最后,您*创建了一个新的RPCPacket
对象,这几乎总是一个错误:构造函数运行时已经有一个新的RPCPacket
对象。可以使用this
(或隐式)访问它,并且需要使用该代码对其进行初始化。
因此,您不必尝试在该方法中创建新的RPCPacket
对象,只需将字段设置为适当的值即可。