Маленькая проблема с преобразованием Objective C в Java Android - PullRequest
0 голосов
/ 29 августа 2011

Я пытаюсь преобразовать код 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 делает то же самое, что и в Objective C, потому что теперь я получаю сообщение об ошибке: «Неявный супер-конструктор RPCPacket () по умолчанию не определен Конструктор. Должен определить явный конструктор ". Есть идеи?

Ответы [ 3 ]

1 голос
/ 29 августа 2011

Я не говорю о Objective-C, но я почти уверен, что вы не делаете то же самое, поскольку код Java неверен:

Из сообщения об ошибке (и имени)Я так понимаю, ваш RPCPacket «метод» является конструктором.Это нормально, если вы хотите, чтобы он вызывался всякий раз, когда кто-то использует new RPCPacket() с соответствующими аргументами.

Но в конце вашего конструктора вы * создаете новый RPCPacket объект, которыйпочти всегда ошибка: там уже является новым RPCPacket объектом, пока работает конструктор.К нему можно получить доступ с помощью this (или неявно), и его нужно инициализировать этим кодом.

Поэтому вместо того, чтобы пытаться создать новый объект RPCPacket в этом методе, вы должны просто установить полядо соответствующих значений.

0 голосов
/ 12 декабря 2012

Сделайте себе одолжение и реализуйте воплощение Android с нуля.Я видел результаты "перевода" ObjC на Java, и это не хорошо.Это два разных зверя, особенно если вы не знакомы с нюансами каждого из них.

Используйте пользовательский интерфейс, который вы хотите создать, в качестве отправной точки, разрабатывайте код с учетом Java и используйте ObjCтолько в качестве ссылки на уровне общей архитектуры.Если вы сделаете это, логика должна стать естественной.

Опять не переводите построчно.Линия Java может выглядеть как линия ObjC, но может сделать что-то совсем другое, о чем вы узнаете слишком поздно.

Удачи.

0 голосов
/ 29 августа 2011

Этот код является кодом конструктора RTCPacket. Вы написали это как метод класса RPCPacket?

Кроме того:

  • Вы определяете другой RPCPacket, записывая RPCPacket packet=null;, затем устанавливаете packet в соответствии с оператором switch, но в коде нигде больше не используете пакет. Поскольку packet является локальной переменной, она теряется. Какая польза от packet, тогда?

  • Вы звоните super(...) с аргументами, переданными RTCPacket(...). Но что такое суперкласс RPCPacket? Это может быть причиной ошибки: Вызов конструктора должен быть первым оператором в конструкторе (это сообщение является копией / вставкой сообщения об ошибке javac при попытке использовать super после написания некоторых другой код в конструкторе).

РЕДАКТИРОВАТЬ, далее к комментариям ниже:

InfoStartRPCPacket и EndStartRPCPacket кажутся подклассами RPCPacket. Но вы не определяете тип вашей инстанции правильным способом. Вместо того, чтобы писать здесь длинный текст, я предлагаю вам посетить это руководство , которое объясняет конструкторы Java лучше, чем я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...