java - 如何比较在不同子类中创建的两个对象

标签 java object methods

我到处都找过了,但没有看到这样的事情。我对java相当陌生,并且有作业。作业是图书馆。它有新的和二手的书籍和 DVD。我想比较一个物体来确定正确的罚款。

我基本上是在问程序,嘿,这是一本书还是一张 DVD?然后嘿,这是一本新书或 DVD,还是一本旧书。

public double isLate(LocalDate argDateCheckedOut, LIBRARYMATERIALS argMaterial)
{ 
    LocalDate dateCheckedIn =  LocalDate.now();
    double diff=ChronoUnit.DAYS.between(argDateCheckedOut, dateCheckedIn);

    double fine = 0;

    if(argMaterial.equals(BOOK))
    {
        //calculate fine for book
        if(argMaterial.getisNew() == true)
        {
            if(diff > 21)
            {
                fine = 1 + .25*diff;
            }

        }
        else if(argMaterial.getisNew() == false)
        {
            if(diff > 28)
            {
                fine = .25 * diff;
            }
        }
    }

    else if(argMaterial.equals(DVD))
    {
        //calculate fine for dvd
        if(argMaterial.getisNew() == true)
        {
            if(diff > 3)
            {
                fine = 5 + diff;
            }

        }
        else if(argMaterial.getisNew() == false)
        {
            if(diff > 7)
            {
                fine = diff;
            }
        }

    }
    return fine;
}

最佳答案

我会考虑以不同的方式进行连接。我会为 Book 和 DVD 创建一个父类或接口(interface)(称为“LibraryResource”)一个公共(public)双 getFine() 方法,也许将其抽象化,然后我会让 Book 和 DVD 重写父方法。让对象自己算算吧,而不是为难自己。

例如,如果你有这样一个父类:

public abstract class LibraryResource {
    private LocalDate checkOutDate;
    private boolean newResource;

    abstract public double calculateFine(); // **** make this abstract ****

    public LibraryResource(LocalDate checkOutDate, boolean newResource) {
        this.checkOutDate = checkOutDate;
        this.newResource = newResource;
    }

    public boolean isNewResource() {
        return newResource;
    }

    public void setNewResource(boolean newResource) {
        this.newResource = newResource;
    }

    public LocalDate getCheckOutDate() {
        return checkOutDate;
    }

}

然后,书籍和 DVD 都可以有自己的罚款计算公式。例如,Book 类可能类似于:

public class Book extends LibraryResource {    
    private static final long SHORT_OVER_DUE_DIFF = 21;
    private static final long LONG_OVER_DUE_DIFF = 28;

    public Book(LocalDate checkOutDate, boolean newResource) {
        super(checkOutDate, newResource);
    }

    @Override
    public double calculateFine() {
        double fine = 0.0;
        LocalDate dateCheckedIn = LocalDate.now();
        long diff = ChronoUnit.DAYS.between(getCheckOutDate(), dateCheckedIn);

        if (isNewResource()) {
            if (diff > SHORT_OVER_DUE_DIFF) {
                fine = 1 + 0.25 * diff;
            } else if (diff > LONG_OVER_DUE_DIFF) {

                // .... ?? 

            }
        } else {
            // else it is NOT new
            if (diff > SHORT_OVER_DUE_DIFF) {

                // .... ??

            } else if (diff > LONG_OVER_DUE_DIFF) {
                fine = 0.25 * diff;                
            }
        }
        return fine;
    }

}

关于java - 如何比较在不同子类中创建的两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43130705/

相关文章:

java - 是否有任何与 Spring 集成的 Java PDF 库?

javascript - 在javascript中按键名对对象数组进行排序

javascript - mongodb 查找查询不起作用

c++ - qt c++ new 类似的方法。我是重载方法、编写新方法还是使用默认参数?

java - 限制或阻止方法的实现

php - 如何使用 PHPUnit 测试特定方法

java - 尝试查看任何资源的文档时,eclipse 中没有 javadoc

java - for循环在字符串中搜索单词

Javascript 定义对象,逗号大小写

java - 无法从 Oracle 调用 dll