Как я могу закончить метод compareTo (Object o) здесь?

1

Это абстрактный класс:

public abstract class AbstractRecord {
    /**
     * Simple getter for the similarity 
     * 
     * @return <code>int</code> containing the similarity
     */
    public abstract int getSimilarity();

    /**
     * Simple getter for the title <code>String</code>
     * 
     * @return <code>String</code> containing the title
     */
    public abstract String getTitle();

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "["+this.title+":"+this.similarity+ "]";
    }
}

и это расширенный класс от него:

public class Record extends AbstractRecord implements Comparable<Record>{
    private int similarity;
    private String title;

    public Record(String title, int similarity) throws IndexException {
        if (title == null || title.isEmpty() || similarity < 0) {
            throw new IndexException("Missing title");
        }
        this.similarity = similarity;
        this.title = title;
    }


    @Override
    public int compareTo(Record r) {
        int result;
        result = r.compareTo( //what should I put here? );
        return result;
    }

    @Override
    public int getSimilarity() {
        return similarity;
    }

    @Override
    public String getTitle() {
        return title;
    }

}

Просто фиксированная проблема с супер переменными и вот новая проблема. Как я могу исправить метод compareTo() здесь, пытаясь сравнить входную запись r с локальной. Спасибо!

  • 0
    Только не объявляйте это в подклассе. Вы можете получить доступ к переменным базового класса напрямую.
  • 1
    Кстати: почему вы объявляете два поля в базовом классе, когда не реализуете их метод получения?
Показать ещё 2 комментария
Теги:

7 ответов

5
 private int similarity;
 private String title;

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

  • 0
    Как я могу получить значение из суперкласса?
  • 0
    @Ryan, поскольку оба поля protected , они будут автоматически наследоваться подклассами. Таким образом, вы можете просто использовать их, как если бы они были объявлены на уровне подкласса. (это this.similarity )
2

Члены вашего title и similarity класса Record скрывают членов одного и того же имени AbstractRecord.

Если у всех AbstractRecord есть title и similarity, было бы getTitle() реализовать getTitle() и getSimilarity() в AbstractRecord, а не в Record.

0

Вы не должны переопределять атрибуты title и similarity в подклассе, а создание abstract геттеров в классе, где определены фактические атрибуты, кажется чрезмерно сложным. Затем, как правило, атрибуты в классе должны быть инициализированы в классе.

Подклассы наследуют все public и protected члены (методы и атрибуты). Это означает, что вы можете использовать их без необходимости его повторного использования.

В приведенной ниже упрощенной версии вашего кода я продолжал проверку параметров в конструкторе подкласса, предполагая, что у вас могут быть разные подклассы с разными ограничениями. Обратите внимание, что если сравнение записей происходит только по title и similarity, вы можете реализовать его в AbstractRecord.

public abstract class AbstractRecord {
    protected String title;
    protected int similarity;

    protected AbstractRecord(String title, int similarity) {
        this.title = title;
        this.similarity = similarity;
    }

    public  int getSimilarity() {return similarity;}

    public  String getTitle() {return title;}

    public String toString() {
        return "["+this.title+":"+this.similarity+ "]";
    }

    // some abstract methods
}

public class Record extends AbstractRecord implements Comparable<Record>{

    public Record(String title, int similarity) throws IndexException {
        super(title, similarity);
        if (title == null || title.isEmpty() || similarity < 0) {
            throw new IndexException("Missing title");
        }
    }

    @Override
    public int compareTo(Record r) {
        return 0;
    }
    // implementation of abstract methods from AbstractRecord 
} 
0

Сделайте ваши поля абстрактного класса protected или public. А для обеспечения безопасности и прав доступа рекомендуется protected.

0

ваши переменные автоматически наследуются. Нет необходимости объявлять его в подклассе. Он не будет переопределять переменную суперкласса

public class Record extends AbstractRecord implements Comparable<Record>{
    //your methods here
}

Над кодом должно быть достаточно

0

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

super.similarity и super.title

0

прежде всего, вам нужно инициализировать переменную родительского класса (AbstractRecord), которую она может выполнить в родительском классе или в дочернем классе по ключевому слову super

super.title = "value";

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

public String getParentTitle(){
     return super.title;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню