AMcoder - javascript, python, java, html, php, sql

Java Անցնելով Մուտքագրեք որպես պարամետր գործառույթի սպասող ենթատիպ

Ես Java-ում նոր եմ և փորձում եմ ստեղծել մի քանի իսկապես պարզ java հավելվածներ: Իմ փորձերում ես ընդհանրացման խնդիր եմ ունեցել: Ես ունեմ Person օբյեկտների ցանկ: Անձը կարող է լինել Հայր կամ Մայր:

Այնուհետև ես ունեմ նույն անունով մի քանի մեթոդ eat(...), բայց դրանք տարբերվում են մուտքային պարամետրերով: Այս մեթոդները Person դասի մաս չեն: Այս մեթոդներից մեկն ընդունում է Մայրը որպես պարամետր, իսկ մյուսը ընդունում է Հայրը:

Հարցն այն է, թե ինչպես դինամիկ կերպով որոշել, թե որ մեթոդն է կանչել անձի ցանկում: երբ ես փորձում եմ կրկնել ցուցակը և զանգահարել o.eat(iterator), այն հուշում է կոմպիլյատորի սխալ, քանի որ iterator-ը Person տեսակի է, բայց իմ eat մեթոդները ցանկանում են որպես պարամետր Մայր կամ Հայր: Կազմողը չգիտի, որ ես մեթոդ ունեմ յուրաքանչյուր տեսակի անձի համար

Մինչ այժմ ես լուծել եմ իմ խնդիրը if հայտարարության հետ, որտեղ ես համեմատում եմ դասի տեսակը GetType() մեթոդով և Mother և հետ: Հայր և եթե դա հավասար է, ես կարող եմ Անձին ընտրել համապատասխան տեսակի մեջ:

Կոդն ունի հետևյալ տեսքը.

  if (person.getClass().equals(Father.class)) {
            theView.eat((Father) person);
        }


  if (person.getClass().equals(Mother.class)) {
            theView.eat((Mother) person);
        }

Սնվելու մեթոդը հետևյալն է.

 public void eat(Mother m){
    textArea.append(m.breakfast);
    textArea.append(m.lunch);
    textArea.append(m.dinner);
 }

ճաշ ընթրիքն ու նախաճաշը ընդամենը մի շարք են, որոնք ցույց են տալիս, թե ինչ է անում մարդը

անձը կոդը կրկնող է Անձի օբյեկտների ցանկի միջոցով

Կա՞ ավելի լավ լուծում, որը կավտոմատացնի գործընթացը:

Thx նախապես.


  • Դա կարող է օգնել, եթե ձեր հարցի մեջ որոշ կոդ ներառեք՝ ձեր խնդիրը ցույց տալու համար: 29.04.2016
  • Ես իսկապես չեմ հասկանում, թե ինչ է նա փորձում անել այստեղ :/ 29.04.2016

Պատասխանները:


1

Այնուհետև, ես ունեմ նույն անունով մի քանի մեթոդ eat (...), բայց դրանք տարբերվում են մուտքային պարամետրերով

Իսկ եթե ձեր դասը տարբեր eat մեթոդներով իրականացվի հետևյալ կերպ.

public class TheView<T extends Person> {
    public void eat(T t) {
         textArea.append(t.getMeals());
    }
}

Եվ այժմ ձեր կրկնվող մեթոդը կարող է իրականացվել հետևյալ կերպ.

public <T> void yourMethod(List<? extends Person> personList) {
    for (Person p : personList) {
         theView.eat(p);
    }
}

Ձեր ցանկը կարող է պարունակել ցանկացած թվով Father կամ Mother օբյեկտ, պայմանով, որ դրանք իրականացնեն / ընդլայնեն Person դասը, ինչպես

public abstract class Person {
    private String breakfast;
    private String lunch;
    // ... other fields

    public abstract void getMeals();

    public String getBreakfast() { return breakfast; }
    // ... other getters
}

public class Father extends Person {
     @Override
     public void getMeals() {
         // implement Father-specific code here
     }
}

public class Mother extends Person {

     @Override
     public String getMeals() {
        StrngBuilder sb = new StringBuilder() ;

        sb.append(getBreakfast());
        sb.append(getLunch());
        sb.append(getDinner());

        return sb.toString();
    }
}
29.04.2016
  • բայց ինչպե՞ս կարող եմ ասել, արդյոք մայրիկին կամ հայրիկին անցել են ուտելու մեթոդը (T t): որովհետև ես ուզում եմ տարբեր գործողություններ անել հոր հետ, քան մոր հետ 29.04.2016
  • eat()-ը կարիք չունի իմանալու, թե կոնկրետ որ տեսակն է փոխանցված, բացառությամբ այն Person տեսակի: Տես վերը նշված փոփոխված կոդը՝ հասկանալու համար, թե ինչ նկատի ունեմ: 29.04.2016
  • բայց այս ուտելու մեթոդով ես ուզում եմ մի քանի տեքստ ավելացնել ցուցակի վանդակում: այնպես որ ես չեմ կարող դա անել մոր և հայրիկի մոդելների մեջ :( մի քիչ խառնաշփոթ է, ես գիտեմ 29.04.2016
  • Կարող եք տեղադրել ձեր eat() մեթոդը, որպեսզի ես կարողանամ օգնել ձեզ: Ես պարզապես կռահում եմ, թե ինչ եք անում դրանում: 29.04.2016
  • Ես խմբագրել եմ վերը նշված կոդը, այնքան պարզ է: ճաշ ընթրիքն ու նախաճաշը ընդամենը մի շարք են, որոնք ցույց են տալիս, թե ինչ է անում մարդը, բայց ենթադրենք, որ ես չեմ ուզում ընթրիքը ցուցադրել հոր ուտելու մեթոդը 29.04.2016
  • Ես ավելացրեցի մի մեթոդ (այս դեպքում getMeals()), որը կարող է ձեզ պատկերացում տալ, թե ինչ եմ մտածում: Սա լավագույն լուծումը չէ, քանի որ getMeals() մեթոդը կարող է պարունակել կրկնօրինակ կոդ: Բայց դա կարող է օգնել ձեզ հեռացնել if-else չեկերը: Օգտատեր @Brandon-ը ձեզ տվել է լավագույն պատասխանը (այցելուի օրինակը), կարծում եմ: 30.04.2016
  • շնորհակալություն ձեր համբերության համար, ինձ դուր է գալիս այս լուծումը, և այո, այն գնալով ավելի ու ավելի է մոտենում այցելուին և կրկնակի առաքման օրինակին 30.04.2016
  • Եթե ​​Person-ից բոլոր դաշտերը փոխարինեք public enum Meal { BREAKFAST, LUNCH, DINNER; }-ով և համապատասխանաբար փոխեք getMeals() մեթոդը, կոդը մի փոքր ավելի մաքուր կլինի: 30.04.2016

  • 2

    Օգտագործեք պոլիմորֆիզմ.

    public interface Person{
        void eat();
    }
    
    public class Mother implements Person{
    
        @Override
        public void eat()
        {
            //the code inside eat(Mother) goes here
        }
    
    }
    
    public class Father implements Person{
    
        @Override
        public void eat()
        {
            //the code inside eat(Father) goes here
        }
    
    }
    

    այնուհետև պարզապես կանչեք ուտելու մեթոդը ձեր Անձի ցուցակի յուրաքանչյուր առարկայի վրա.

    for(final Person person: personList){
        person.eat();
    }
    
    29.04.2016
  • շնորհակալություն պատասխանի համար, խնդիրն այն է, որ ուտելու մեթոդը անձի անդամ չէ, բայց անձը ուտելու մեթոդի փաստարկն է: Մեթոդ ուտելը օբյեկտի անդամ է, որը պատասխանատու է կիրառման դիտման համար: 29.04.2016

  • 3

    Կարծում եմ՝ Ձեզ անհրաժեշտ է Visitor օրինաչափությունը՝ ձեր ասածի պատճառով այստեղ

    Հարցն այն է, թե ինչպես դինամիկ կերպով որոշել, թե որ մեթոդն է կանչել Անձի ցուցակում:

    https://sourcemaking.com/design_patterns/visitor/java/2

    Սա օգնում է ձեզ որոշել, թե որ երթուղին դինամիկ կերպով գնալ գործարկման ժամանակ

    Վիքիպեդիայից՝ https://en.wikipedia.org/wiki/Double_dispatch

    կրկնակի առաքումը բազմակի առաքման հատուկ ձև է և մեխանիզմ, որը գործառույթի կանչ է ուղարկում տարբեր կոնկրետ գործառույթների՝ կախված զանգի մեջ ներգրավված երկու օբյեկտների գործարկման ժամանակի տեսակներից:

    29.04.2016
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..