Это абстрактный класс:
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 с локальной. Спасибо!
private int similarity;
private String title;
Не нужно объявлять название и сходство в подклассе, вы можете его инициализировать, используя ключевое слово super
protected
, они будут автоматически наследоваться подклассами. Таким образом, вы можете просто использовать их, как если бы они были объявлены на уровне подкласса. (это this.similarity
)
Члены вашего title
и similarity
класса Record скрывают членов одного и того же имени AbstractRecord
.
Если у всех AbstractRecord
есть title
и similarity
, было бы getTitle()
реализовать getTitle()
и getSimilarity()
в AbstractRecord
, а не в Record
.
Вы не должны переопределять атрибуты 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
}
Сделайте ваши поля абстрактного класса protected
или public
. А для обеспечения безопасности и прав доступа рекомендуется protected
.
ваши переменные автоматически наследуются. Нет необходимости объявлять его в подклассе. Он не будет переопределять переменную суперкласса
public class Record extends AbstractRecord implements Comparable<Record>{
//your methods here
}
Над кодом должно быть достаточно
Оба поля базового класса будут унаследованы к дочернему классу. Вам просто нужно использовать super
ключевое слово для доступа к полям класса Base как:
super.similarity
и super.title
прежде всего, вам нужно инициализировать переменную родительского класса (AbstractRecord), которую она может выполнить в родительском классе или в дочернем классе по ключевому слову super
super.title = "value";
Это же ключевое слово вы можете использовать для доступа к нему.
public String getParentTitle(){
return super.title;
}