繁体   English   中英

如何使用 Java 子类

[英]How to use Java subclasses

我有 3 个课程,书籍、儿童书和图书馆。 ChildrensBook 扩展了图书 class。 ChildrensBook 包含附加变量 RecommendedAge。 Library 包含一个数组,该数组可以包含 Book 和 ChildrensBook 对象。 在 class 库中,我必须创建 int forChildren(int n) 方法,它返回数组库中有多少年龄小于或等于 n 的儿童书。 问题是图书馆数组中既有 Books 又有 ChildrensBooks,所以我无法访问 RecommendedAge 变量,因为它只在儿童读物中。 我能怎么做?

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;
    }
}

基本上我看到了三种可能的方法:

  1. 将有关推荐年龄的知识拉到Book class 中,以便每本书都有推荐年龄,尽管您需要确定非儿童书籍的推荐年龄。

  2. 如果一Book是否是儿童读物,决定是否对书籍进行迭代——这可以使用 Java 的instanceof运算符来实现,尽管这不是特别面向 object 的。

  3. 为书籍添加类似于isValidForAge的方法,以确定书籍是否对特定给定年龄有效,每个儿童书籍都根据推荐年龄回答,而每个非儿童书籍都需要根据其他标准回答。

这是不正确的 class 设计。 你混合了对书籍分类(儿童、成人、科幻小说、幽默)的关注,这更像是一个类别或“标签”和特定的行为(适合观众)。

您可以决定制作 Book class 抽象并从中继承具体的 AdultBook class。 正如其他答案中已经提到的,您可以拥有一本仍然适合儿童的成人书籍。 比方说传记或百科全书。

这意味着,您可能希望对收藏中的每本书都执行getRecommendedAge()

您可以使用instanceof运算符来检查 object 的类型。 试试下面的代码:

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;
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM