Как мне получить доступ к дочерним полям объекта внутри определенного пользователем набора деревьев? - PullRequest
0 голосов
/ 29 июня 2019
public class Dog extends Animal implements Comparable<Animal> {
    private String name;
    private String breed;
    private boolean isPottyTrained;

public class Frog extends Animal implements Comparable<Animal> {
    private String color;
    private double maxJump;
    private int bugsEatenPerDay;

public class Animal {
    private double weight;
    private double height;
    private double length;

Я создал TreeSet типа Animal. У меня 2 детей Animal (Dog и Frog). Моя цель - установить естественный порядок Dog класса в алфавитном порядке по его имени и Frog класса, упорядоченного по цвету (в алфавитном порядке).

public int compareTo(Animal o) {
        if (o.getClass().equals(Dog.class)) {
            int temp = this.name.compareToIgnoreCase(o.getClass().getName());
            if (temp == 0) {
                return 0;
            } else if (temp > 0) {
                return 1;
            } else {
                return -1;
            }
        }

        return 0;

    } // I am not even sure what is producing

Это код, который я пробовал в классе Dog, но он не дал никакого результата.

В идеале я хочу, чтобы код был что-то вроде

if (this.name > o.getName()) {
...
}  //pseudocode

Но я знаю, что родитель не может получить доступ к полям детей. Есть ли способ обойти это?

Ответы [ 2 ]

0 голосов
/ 29 июня 2019
public int compareTo(Animal o) {

        if (o instanceof Frog) {
            int compare = this.name.compareToIgnoreCase(((Frog) o).getColor());
            if (compare > 0) {
                return 1;
            } else if (compare < 1) {
                return -1;
            } else {
                return 0;
            }
        } else if (o instanceof Dog) {
            int compare = this.name.compareToIgnoreCase(((Dog) o).getName());
            if (compare > 0) {
                return 1;
            } else if (compare < 1) {
                return -1;
            } else {
                return 0;
            }

        }
        return 0;

    }// end compareTo

Это внутри класса Dog. Тот же принцип применим к классу лягушек

0 голосов
/ 29 июня 2019

Если под «дочерним» вы подразумеваете подкласс, вы должны иметь возможность доступа к методам подкласса путем приведения, например, так:

((Dog) o).getName()

Это будет работать только в том случае, если вы приведете менее конкретный класс к более конкретному классу, который он реализует, в противном случае он выдаст исключение ClassCastException.

Тогда полное решение будет выглядеть так:

public int compareTo(Animal o) {
    if (o instanceof Dog) 
        return this.name.compareToIgnoreCase(((Dog) o).getName());
    return 0;
}

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

Вы упоминаете, что не знаете, что производит функция сравнения; это производит число, которое означает одно из следующего:

  • Объект «меньше» значения параметра (<= -1) </li>
  • Объект «равен» значению параметра (0)
  • Объект «больше» значения параметра (> = 1)

Это можно использовать, например, для сортировки списка в соответствии с определенными вами правилами.

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