• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

comparTo a dziedziczenie

VPS Starter Arubacloud
0 głosów
296 wizyt
pytanie zadane 8 lutego 2018 w Java przez kosttek Początkujący (450 p.)

Witam, podczas ćwiczeń wpadłem na problem, którego nie umiem rozwiązać  frown

A więc dla zobrazowania problemu mam mniej więcej taki kod:

class Employee implements Comparable<Employee> {
    private double salary;

    @Override
    public int compareTo(Employee e) {
        return Double.compare(salary, e.salary);
    }
}

class Manager extends Employee {
    private double bonus;

    @Override
    public int compareTo(Employee e) {
        //return Double.compare(salary, e.salary); jak porównać po polu bonus a nie salary?
    }
}

Mam nadzieję, że ktoś ma jakiś pomysł jak można to rozwiązać laugh

1 odpowiedź

+1 głos
odpowiedź 8 lutego 2018 przez Aisekai Nałogowiec (42,190 p.)
wybrane 8 lutego 2018 przez kosttek
 
Najlepsza
Dodać gettera do pola bonus i porównać tak samo jak salary, tylko zamiast e.salary dać e.getBonus()

Jeżeli o to Ci chodziło.
komentarz 8 lutego 2018 przez kosttek Początkujący (450 p.)
przywrócone 8 lutego 2018 przez kosttek

Tak, nie pomyślałem o takim prostym rozwiązaniulaugh Dzięki wink

komentarz 8 lutego 2018 przez kosttek Początkujący (450 p.)
Tak się jeszcze nad tym zastanawiam czy jest może jakiś sposób aby metoda przyjmowała tylko obiekty Manager, żeby nie można było zrobić błędu i posłać Employee, który nie ma pola bonus.?
komentarz 8 lutego 2018 przez Aisekai Nałogowiec (42,190 p.)
Wróć, bo nie zauważyłem.

Nie możesz porównywać Employee z Managerem biorąc pod uwagę bonus.  Musisz zmienić Employee na Manager. Więc tak:

public int compareTo(Manager manager)

i dalej manager.getBonus().

PS: nie używałbym 'e' jako nazwy dla obiektu klasy Employee. 'e' raczej oznacza wyjątek (exception). Zresztą, jak wygenerujesz sobie blok try-catch to catch będzie mniej więcej tak wyglądał:

catch(Exception e)
komentarz 8 lutego 2018 przez kosttek Początkujący (450 p.)

Okej będę pamiętał na przyszłość o tym e :D

Właśnie problem jest w tym, że po zmianie public int compareTo(Employee employee) na public int compareTo(Manager manager) metoda nie nadpisuje już metodyz nadklasy, bo jest inna sygnatura czyli np. w Arrays.sort użyje mi metody z nadklasy sad

komentarz 8 lutego 2018 przez mbabane Szeryf (79,280 p.)

Czy takie coś jest w ogóle wykonalne technicznie? tzn. bo jeśli Emplooyee nie ma metody getBonus to taki kod nie przejdzie nawet procesu kompilacji:

class Employee implements Comparable<Employee> {
    protected double salary;

    @Override
    public int compareTo(Employee e) {      
      
        return 1;
    }
}


class Manager extends Employee{
    private double bonus;

    @Override
    public int compareTo(Employee e) {

        System.out.println(e.getBonus()); //niekompilowalne
        return 2;
    }
}

 

komentarz 8 lutego 2018 przez kosttek Początkujący (450 p.)
edycja 8 lutego 2018 przez kosttek

Korzystam z Intellij i skompilowało beż żadnego problemu wink Oczywiście posyłałem do metody obiekt Manager.

@Edit

Cofam to, zapominałem że wszczepiennej w moich testach miałem rzutowanie na Manager, własnie sprawdzałem jeszcze raz i nie działa jednak cheeky

komentarz 8 lutego 2018 przez Aisekai Nałogowiec (42,190 p.)
Nie wiem czy coś takiego jest akceptowalne, ale zawsze można próbować zrobić z Employee zrobić klasę abstrakcyjną, po której będzie dziedziczyła jakaś inna klasa (implementująca Comparable<Employee> <- nazwa klasy rozszerzającej) i druga klasa dziedzicząca (z polem bonus, implementująca Comparable<Manager>)
komentarz 8 lutego 2018 przez kosttek Początkujący (450 p.)

Oo super pomysł laugh

Dzięki wszystkim za pomoc :D

komentarz 8 lutego 2018 przez mbabane Szeryf (79,280 p.)

Ok, pomijając to o czym wspomniałem to jeszcze istnieje taka metoda z wykorzystaniem dobrodziejstw Javy 8 (konkretnie z lambdy). Tym sposobem nie zaśmieca się własnej klasy implementacją Comparable:

import java.util.*;

class MyClass
{
    private int val;

    MyClass(int v)
    {
        val = v;
    }

    int getVal()
    {
        return val;
    }

    @Override
    public String toString()
    {
        return "MyClass{" +
                "val=" + val +
                '}';
    }
}


class ComparableUtill
{
    static int compareMC(MyClass a, MyClass b)
    {
        return Integer.compare(a.getVal(), b.getVal());
    }
}

public class UseMethodRef
{
    public static void main(String args[])
    {
        MyClass al[] = new MyClass[6];
        al[0] = new MyClass(1);
        al[1] = new MyClass(4);
        al[2] = new MyClass(2);
        al[3] = new MyClass(9);
        al[4] = new MyClass(3);
        al[5] = new MyClass(7);

        Arrays.sort(al, ComparableUtill::compareMC);
        System.out.println(Arrays.toString(al));
    }
}

Czyli tworze sobie zewnętrzną metodę do porównania obiektów.

komentarz 8 lutego 2018 przez kosttek Początkujący (450 p.)

Też ciekawy sposób, a przy okazji lambdy poćwiczęcheeky Dziękilaugh

Podobne pytania

0 głosów
1 odpowiedź 274 wizyt
+1 głos
2 odpowiedzi 2,712 wizyt
pytanie zadane 12 maja 2015 w Java przez rubesom Obywatel (1,690 p.)
0 głosów
3 odpowiedzi 1,623 wizyt
pytanie zadane 10 maja 2015 w Java przez rubesom Obywatel (1,690 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...