Java 如何比较在不同子类中创建的两个对象
我到处都找过了,没见过这样的东西。我对java相当陌生,有一个家庭作业。作业是图书馆。它有书籍和dvd,新的和旧的。我想比较一个物体来确定正确的罚款 我基本上是在问这个节目,嘿,这是一本书还是一张dvd?然后,嘿,这是一本新书或dvd,还是一张旧的Java 如何比较在不同子类中创建的两个对象,java,object,methods,Java,Object,Methods,我到处都找过了,没见过这样的东西。我对java相当陌生,有一个家庭作业。作业是图书馆。它有书籍和dvd,新的和旧的。我想比较一个物体来确定正确的罚款 我基本上是在问这个节目,嘿,这是一本书还是一张dvd?然后,嘿,这是一本新书或dvd,还是一张旧的 public double isLate(LocalDate argDateCheckedOut, LIBRARYMATERIALS argMaterial) { LocalDate dateCheckedIn = LocalDate.n
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重写父方法。让物体自己计算好,而不是让自己为难。先生,先生,你在吗?