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

Java 如何比较在不同子类中创建的两个对象,java,object,methods,Java,Object,Methods,我到处都找过了,没见过这样的东西。我对java相当陌生,有一个家庭作业。作业是图书馆。它有书籍和dvd,新的和旧的。我想比较一个物体来确定正确的罚款 我基本上是在问这个节目,嘿,这是一本书还是一张dvd?然后,嘿,这是一本新书或dvd,还是一张旧的 public double isLate(LocalDate argDateCheckedOut, LIBRARYMATERIALS argMaterial) { LocalDate dateCheckedIn = LocalDate.n

我到处都找过了,没见过这样的东西。我对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创建一个父类或接口,比如称为LibraryResource的公共双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;
    }

}

在通过电子邮件与教授交谈后,我找到了一个简单的解决方法。我相信你的答案会有用的,但我在寻找更多的。。。更简单的修复

给你。我们使用instanceof来比较对象,并相应地工作

double fine = 0;

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

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

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

    }
    else if(argIsNew == false)
    {
        if(diff > 7)
        {
            fine = diff;
        }
    }

}
    return fine;

不,我会完全不同的。我会给Book和DVD的父类一个公共的双getFine方法,也许会使它抽象,然后我会让Book和DVD重写父方法。让物体自己计算好,而不是让自己为难。先生,先生,你在吗?