Как использовать подклассы Java - PullRequest
0 голосов
/ 08 мая 2020

У меня 3 класса: Книга, Детская книга и Библиотека. ChildrensBook расширяет класс Book. ChildrensBook содержит дополнительную переменную RecommendedAge. Библиотека содержит массив, который может включать как объекты Book, так и ChildrensBook. В библиотеке классов мне нужно создать метод int forChildren (int n), который возвращает, сколько childrensBook возраста меньше или равного n находится в библиотеке массива. проблема в том, что в массиве библиотеки есть как книги, так и детские книги, поэтому я не могу получить доступ к переменной рекомендованного возраста, потому что она находится только внутри детской книги. как я могу сделать?

public class Library {
    private ArrayList <Book> collection;

    public Library(ArrayList <Book> c){
        collection=c;
    }

    public int forChildren(int n) {
        int count=0;
        for(int i=0;i<collection.size();i++) {
            if((collection.get(i).getRecommendedAge)<=n) {
                count++;
            }
        }
        return count;
    }

public class Book {
    private String title;
    private String author;

    public Book(String title, String author){
        this.title=title;
        this.author=author;
    }

}

public class ChildrensBook extends Book {
    private int recommendedAge;

    public ChildrensBook(String title,String author,int recommendedAge){
        super(title,author);
        this.recommendedAge=recommendedAge;
    }
    public int getRecommendedAge() {
        return recommendedAge;
    }
}

Ответы [ 3 ]

4 голосов
/ 08 мая 2020

В основном я вижу три возможных подхода:

  1. Извлеките информацию о рекомендуемом возрасте до класса Book, чтобы каждая книга имела рекомендуемый возраст, хотя затем вам нужно решить, какой рекомендуемый возраст не детской книги.

  2. Решите, повторять ли книги, является ли Book детской книгой или нет - этого можно достичь, используя Java s instanceof оператор, хотя он не является особенно объектно-ориентированным.

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

1 голос
/ 08 мая 2020

Это неправильный дизайн класса. Вы смешали проблему классификации книг (дети, взрослые, научная фантастика, юмор), которая больше похожа на категорию или «тег», и конкретное поведение (которое подходит для аудитории).

Вы можете решить чтобы сделать класс Book абстрактным и унаследовать от него конкретный класс AdultBook. Как уже упоминалось в другом ответе, у вас может быть книга для взрослых, которая по-прежнему подходит для детей. Скажем, биография или энциклопедия.

Это означает, что вы можете упражняться в getRecommendedAge() над каждой книгой в вашей коллекции.

0 голосов
/ 08 мая 2020

Вы можете использовать оператор instanceof, чтобы проверить тип объекта. Попробуйте следующий код:

public class Library {
    private ArrayList<Book> collection;

    public Library(ArrayList<Book> c) {
        collection = c;
    }

    public int forChildren(int n) {
        int count = 0;
        for (int i = 0; i < collection.size(); i++) {
            if (collection.get(i) instanceof ChildrensBook) {
                if (((ChildrensBook) collection.get(i)).getRecommendedAge() <= n) {
                    count++;
                }
            }
        }
        return count;
    }

    public class Book {
        private String title;
        private String author;

        public Book(String title, String author) {
            this.title = title;
            this.author = author;
        }

    }

    public class ChildrensBook extends Book {
        private int recommendedAge;

        public ChildrensBook(String title, String author, int recommendedAge) {
            super(title, author);
            this.recommendedAge = recommendedAge;
        }

        public int getRecommendedAge() {
            return recommendedAge;
        }
    }
...