2013-05-31 3 views
0

Как показано ниже, у меня есть следующий код в качестве моего конструктора. Но я хочу дублировать его с другим именем. Но я получаю ошибку. Могу ли я каким-то образом изменить это требование?Тот же конструктор с различным аргументом

Это оригинальный код:

public HeyStatus(byte[] bytes) 
    { 
     this(); 

     int offset = 7; 
     for (int i = 1; i < 9; ++i) 
     { 
      partition1Status[i-1].status = (bytes[offset + i] & 0x0F); 
      partition2Status[i-1].status = (bytes[offset + i + 9] & 0x0F); 
     } 

     if((bytes[offset + 9] == 0) || (bytes[offset + 9] == 1)){ 
      isPartitioned = (bytes[offset + 9] == 0) ? false : true; 
     } 

     partition1Status.status = (bytes[offset + 18] - 0x30); 
     partition2Status.status = (bytes[offset + 19] - 0x30); 

     String model = "" + (char)bytes[1] + (char)bytes[2]; 
     if (model.equalsIgnoreCase("!A")) 
      modelNum = "T32"; 
    } 

Я хочу, чтобы добавить этот код после предыдущего кода:

public HeyStatus(byte[] bytes2) <----the line I am getting error 
    { 
     this(); 

     int offset = 7; 
     for (int i = 1; i < 9; ++i) 
     { 
      partition3Status[i-1].status = (bytes[offset + i] & 0x0F); 
      partition4Status[i-1].status = (bytes[offset + i + 9] & 0x0F); 
     } 


     if((bytes[offset + 9] == 0) || (bytes[offset + 9] == 1)){ 
      isPartitioned = (bytes[offset + 9] == 0) ? false : true; 
     } 

     partition3Status.status = (bytes[offset + 18] - 0x30); 
     partition4Status.status = (bytes[offset + 19] - 0x30); 

     String model = "" + (char)bytes[1] + (char)bytes[2]; 
     if (model.equalsIgnoreCase("!A")) 
      modelNum = "T32"; 
    } 
+0

Я хочу точно такую ​​же подпись, как вы можете видеть, что код в обоих конструкторах почти одинаковый. Это о той же переменной, которая не совпадает с тем же номером. – Angela

+0

Вы видите это неправильно? Мое слово медведь ~ – Angela

+0

проверить Редактировать мой ответ - это решение вашей проблемы, если вы не понимаете, я дам больше информации – Hosni

ответ

0
public HeyStatus(byte[] bytes) 
public HeyStatus(byte[] bytes2) 

Оба же декларация. Вам нужно изменить тип параметра (byte[]), чтобы перегрузить конструктор. Перегрузка конструктора или метода основана на различии в подписях. Здесь вы используете одну и ту же подпись для обоих определений конструктора, просто изменяя имя параметра, и это неверно.

Прочитано Javadoc для получения дополнительной информации.

Язык программирования Java поддерживает методы перегрузки, а Java может различать методы с различными сигнатурами методов. Это означает, что методы внутри класса могут иметь одно и то же имя, если они имеют разные списки параметров.

0

Вы не изменили подпись конструктора. Оба конструкторов имеют то же тип:

public HeyStatus(byte[] bytes) 
public HeyStatus(byte[] bytes2) 

Если вы предоставляете различные типы аргументов, различное число аргументов, или оба, вы можете определить несколько конструкторов с тем же именем. Он звонит Constructor Overloaing.

+0

Но я хочу точно такую ​​же подпись, как вы можете видеть, что код в обоих конструкторах почти одинаковый. Это о той же переменной, которая не совпадает с тем же номером. – Angela

+0

Это только определение. Вы можете передать разные аргументы [в вашем коде, разные номера] конструктор при вызове. – OguzOzkeroglu

3

Это вопрос method overloading (конструкторы - особый вид методов).
Короче говоря, вы можете различать только два метода по их имени и типу аргументов.

Вы не можете объявить более одного метод с тем же именем и таких же количеством и типом аргументов, потому что компилятор не может сказать их друг от друга.

0

Вы не можете использовать два метода с одной и той же сигнатурой в одном классе. Это также относится к конструкторам. Там нет никакого способа для компилятора, чтобы узнать, какой из них вы звоните, если вы делаете что-то вроде этого:

byte[] bytes = new bytes[]{1, 2, 3}; 
new HeyStatus(bytes); 
0

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

byte[] bytesOne[]= new bytes[]{1,2,3}; 
byte[] bytesTwo[] =new bytes[]{4,5,6}; 

HeyStatus hStatusOne = new HeyStatus(bytesOne); 
HeyStatus hStatusTwo = new HeyStatus(bytesTwo); 

Но только ОДИН Контрактор.

P.S. если вы хотите использовать больше параметров конструкторов внутри него, ДОЛЖНО быть отличным от первого, типа (не в имени) и/или числа. Вы можете получить дополнительную информацию от конструкторов перегрузок по перегрузке.

Edit:

Просто заметил разницу с partion1Status [] (и другие) положить partionStatus в параметрах.

пример головы ваших конструкторов должен выглядеть следующим образом:

public HeyStatus(byte[] bytes, typeOfpartionStatus partitionOneStatus, typeOfpartionStatus partitionTwoStatus){ 
this(); 

    int offset = 7; 
    for (int i = 1; i < 9; ++i) 
    { 
     partitionOneStatus[i-1].status = (bytes[offset + i] & 0x0F); 
     partitionTwoStatus[i-1].status = (bytes[offset + i + 9] & 0x0F); 
    } 


    if((bytes[offset + 9] == 0) || (bytes[offset + 9] == 1)){ 
     isPartitioned = (bytes[offset + 9] == 0) ? false : true; 
    } 

    partitionOneStatus.status = (bytes[offset + 18] - 0x30); 
    partitionTwoStatus.status = (bytes[offset + 19] - 0x30); 

    String model = "" + (char)bytes[1] + (char)bytes[2]; 
    if (model.equalsIgnoreCase("!A")) 
     modelNum = "T32"; 
} 

когда вы называете это должно выглядеть следующим образом.

HeyStatus hstatusOne = new (bytesOne,partion1Status,partition2Status); 
HeyStatus hstatusTwo = new (bytesTwo,partion3Status,partition4Status); 
+0

Теперь я думаю, что я дал все :) – Hosni

+0

Я пробовал ваше решение, появилось много новых ошибок, связанных с этим кодом. Теперь я отлаживаю, чтобы узнать, можно ли его решить. Если все еще будет продолжаться, я сообщу вам. спасибо за вашу любезную помощь. Те, кому просто нравится голосовать, я не понимаю, о чем они думают. Они могут просто дать мне ответ, если они могут помочь. Почему я голосую за свой вопрос, так как я сказал, что я новичок в разработке приложений для Android. – Angela

+0

так это сработало? – Hosni

0

Если вы хотите иметь два конструктора с одинаковой кол paremeter и типами, вы должны использовать static factory method шаблон. Сделать такие методы, как
public static HeyStatus constructFromArray1(byte[] bytes) {...}
и
public static HeyStatus constructFromArray2(byte[] bytes) {...}
(вы должны назвать, что методы должным образом, не использовать имена, которые я предложил), которые будут строить объекты должным образом, то вы можете создавать объекты из кода как
HeyStatus heyStatus = HeyStatus.constructFromArray1(bytes)
(вместо HeyStatus heyStatus = new HeyStatus(bytes).
Это самый лучший способ сделать то, что вы хотите.

0

вы можете использовать только один конструктор, добавив дополнительный (например) параметр Int, чтобы определить, какие из кодовых блоков, которые должны выполняться. L икэ это, вы будете иметь один конструктор, содержащий два блока кода, нужно:

public HeyStatus(byte[] bytes, int option){ 
switch (option){ 
case 1: { 
//you can place here the code you used in the first constructor 
break; 
} 
case 2:{ 
//you can place here the code you used in the second constructor 
break; 
} 
default: break; 
} 

И когда вы вызываете конструктор, вы должны будете указать параметр в списке параметров. Приветствия!

Смежные вопросы