Ошибка: 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;
    }
}
Другие вопросы по тегам