Той жа канструктар з іншым аргументам

Як паказана ніжэй, у мяне ёсць наступны код, як мой канструктар. Але я хачу, каб дубляваць яго з іншым імем. Але я атрымліваю паведамленне пра памылку на гэтым. Ці магу я неяк змяніць, каб адпавядаць патрабаванням?

Гэта зыходны код:

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, крыніца
Ці бачыце вы гэта няправільна? Маё слова мядзведзь ~
дададзена аўтар Angela, крыніца
Праверце мой адказаць , гэта лепшы спосаб, каб атрымаць тое, што вы хочаце.
дададзена аўтар SpongeBobFan, крыніца
праверце Апрацаваць мой адказ, што гэта рашэнне вашай праблемы, калі вы не разумееце, я дам больш інфармацыі
дададзена аўтар Hosni, крыніца

7 адказы

Гэта пытанне перагрузкі (Канструктары адмысловы выгляд метады).
Карацей кажучы вы можаце толькі differenciate два метаду ад іх імя, і тыпу аргументаў.

<�Р> Вы не можаце абвясціць больш аднаго метаду з тым жа імем, а   такое ж колькасць і тып аргументаў, таму што кампілятар не можа сказаць   іх адзін ад аднаго.
3
дададзена
public HeyStatus(byte[] bytes)
public HeyStatus(byte[] bytes2)

Абодва ж дэкларацыя. Вы павінны змяніць тып параметру ( байт [] ) для перагрузкі канструктара. Канструктар або Метад перагрузкі заснаваны на розніцы ў подпісы. Тут Вы карыстаецеся адзін і той жа подпіс для абодвух азначэнняў канструктара, проста змяніўшы імя параметру, і гэта недапушчальна.

Прачытайце Javadoc больш.

The Java programming language supports overloading methods, and Java can distinguish between methods with different method signatures. This means that methods within a class can have the same name if they have different parameter lists.

0
дададзена

Вы не змянілі канструктар подпісы. Абодва канструктараў маюць той жа тып:

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

Калі вы дае розныя тыпы аргументаў, розныя колькасці аргументаў, або абодва, вы можаце вызначыць некалькі канструктараў з тым жа імем. Ён тэлефануе Канструктар Overloaing .

0
дададзена
Але я хачу дакладна такую ​​ж подпіс, як вы можаце ўбачыць код у абодвух канструктарах амаль тое ж самае. Гаворка ідзе пра тую ж зменнай, якая не з'яўляецца такім жа нумарам.
дададзена аўтар Angela, крыніца
Гэта адзінае азначэнне. Вы можаце перадаваць розныя аргументы [у кодзе, розныя нумары] канструктара пры выкліку яго.
дададзена аўтар OguzOzkeroglu, крыніца

If you want to have two constructors with the same paremeter count and types, you should use static factory method pattern. Make methods like
public static HeyStatus constructFromArray1(byte[] bytes) {...}
and
public static HeyStatus constructFromArray2(byte[] bytes) {...}
(you should name that methods properly, don't use the names that I proposed), that will construct objects properly, then you can construct objects from code like
HeyStatus heyStatus = HeyStatus.constructFromArray1(bytes)
(instead of HeyStatus heyStatus = new HeyStatus(bytes).
It's the best way to do what you want.

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);

Але толькі адзін забудоўшчык.

пастскрыптум калі вы хочаце выкарыстоўваць параметры больш канструктараў у ім павінен адрознівацца ад першага, па тыпу (не ў назве) і/або нумар. Вы можаце атрымаць больш інфармацыі звяртаючыся да дапамогі перагружаць канструктары.

змяніць:

Проста заўважыў розніцу з 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
дададзена
Я паспрабаваў ваша рашэнне, шмат новых памылкі, звязаныя з гэтым кодам адбыўся. Я цяпер адладкі, каб убачыць, калі яна можа быць вырашана. Калі па-ранейшаму захоўваецца, я б паведаміць і. Дзякуем Вам за дапамогу. Тыя, хто гэтак жа, як для ўніз галасавання, я не разумею, пра што яны думаюць. Яны могуць проста даць адказ на мяне, калі яны ў стане дапамагчы. Чаму ўніз галасавання на маё пытанне, як я сказаў, што я пачатковец у распрацоўку прыкладання для Android.
дададзена аўтар Angela, крыніца
Цяпер я думаю, што я даў усе :)
дададзена аўтар Hosni, крыніца
так гэта працаваць?
дададзена аўтар Hosni, крыніца

Вы можаце выкарыстоўваць толькі адзін канструктар, дадаўшы дадатковы (напрыклад) параметр Int, каб вызначыць, якія з кодавых блокаў, якія павінны выконвацца. Як гэта, вы будзеце мець адзін канструктар, які змяшчае два блокі кода, вам трэба:

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;
}

І калі вы будзеце выклікаць канструктар, вы павінны будзеце пазначыць параметр ў спісе параметраў. Ура!

0
дададзена