Ошибка: Book не является абстрактным и не переопределяет абстрактный метод getPageCount в Citable. Должен ли я сделать класс абстрактным из-за класса интерфейса?
Я пытаюсь сделать школьный проект, в котором я пишу приложение, которое имеет дело с книгами, коллекциями книг (назовем это библиотекой) и UI-клиентом для этих классов.
Одним из классов является класс с именем Citable, который требует реализации типичных функций средства доступа, которые возвращают ISBN, автора, название и издателя книги (все строки), а также год публикации, месяц и день (все целые числа) и Количество страниц (целое число).
Следующий класс - класс Book, который реализует интерфейс Citable. Библиотеке нужно будет сортировать книги по номерам ISBN, поэтому в Book вам также потребуется обеспечить поддержку (подсказка: для этого требуется реализация дополнительного интерфейса (тот, который вам не нужно писать, просто реализуйте) и написание дополнительного метода (который должен содержать только одну строку кода), и эта библиотека делает простой вызов для выполнения сортировки). Здесь нет статики (кроме метода тестирования) и вообще никакого пользовательского интерфейса. Я покажу вам, что я сделал до сих пор:
public interface Citable
{
public String getISBN();
public String getAuthor();
public String getTitle();
public String getPublisher();
public int getPublicationYear();
public int getMonth();
public int getDay();
public int getPageCount();
}
и интерфейс книги:
import java.util.*;
public abstract class Book implements Citable, Comparable
{
/**
* Constructor for objects of class Book
*/
public Book()
{
Collections.sort(ISBN);
}
public String toString (){
String info = ISBN + "\n" + title + "\n" + author + "\n" + publisher +
"\n" + publicationYear + "\n" + month + "\n" + day;
return info;
}
}
В классе Book я реализую как созданный мной интерфейс, так и встроенный в Java Comparable. У меня такой вопрос: в классе Book я получил ошибку: Book не является абстрактным и не переопределяет абстрактный метод getPageCount в Citable. Единственный способ исправить ошибку - сделать класс Book абстрактным. Тем не менее, я не получаю никаких указаний на то, что я должен сделать этот класс абстрактным. Есть ли выход из этого?
2 ответа
Твой класс Book
реализует два интерфейса, а именно Citable
а также Comparable
, Это означает, что вы должны реализовать методы из этих интерфейсов в вашем классе. Единственный другой способ - сделать класс Book абстрактным, то есть вы не можете создать его экземпляр. Но это определенно не то, что вы хотите.
Твой класс Book
будет выглядеть примерно так:
public class Book implements Citable, Comparable
{
/**
* Constructor for objects of class Book
*/
public Book()
{
Collections.sort(ISBN);
}
public String toString (){
String info = ISBN + "\n" + title + "\n" + author + "\n" + publisher +
"\n" + publicationYear + "\n" + month + "\n" + day;
return info;
}
@Override
public int compareTo(Object o) {
//Implement this method
}
@Override
public String getISBN() {
return isbn;
}
//other methods from your interfaces here...
}
Насколько я понял из вашей стратегии решения - это создание интерфейса для контракта метода и реализация этого интерфейса в вашем классе. Для этого, во-первых, позвольте мне напомнить, что, как только вы реализуете интерфейс, вам необходимо реализовать все его абстрактные методы. Ошибка связана с этим. Таким образом, есть два варианта: во-первых, вы можете реализовать методы Citable в классе Book. Во-вторых, вы можете написать эти методы по умолчанию в интерфейсе Citable и просто использовать их в классе Book. Я поделился примером кода с некоторыми комментариями, пожалуйста, проверьте их
Образец кода:
import java.util.Collections;
public class Book implements Citable, Comparable
{
/**
* Constructor for objects of class Book
*/
public Book()
{
Collections.sort(getISBN());//there is no sort method for Strings, sort method is only for lists
}
public String toString (){
String info = getISBN() + "\n" + title + "\n" + author + "\n" + publisher +
"\n" + publicationYear + "\n" + month + "\n" + day;//You need to use getter methods
return info;
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getISBN() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getAuthor() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getTitle() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getPublisher() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getPublicationYear() {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getMonth() {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getDay() {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getPageCount() {
// TODO Auto-generated method stub
return 0;
}
}