我需要帮助如何使类扩展实现在不同情况下工作。
在培训期间,我完成了下一个任务:
*Decrementing Carousel 是一个容器,接受 int 元素。 DecrementingCarousel 具有通过构造函数指定的最大容量。创建时,DecrementingCarousel 处于累积状态:您可以通过 addElement 方法添加元素,并可以通过 run 方法生成 CarouselRun 对象。一旦调用 run 方法,DecrementingCarousel 就处于运行状态:它拒绝添加更多元素。
CarouselRun 允许迭代轮播的元素,使用 next 方法将它们逐个递减。下一个返回当前元素的值。
然后将当前元素减一并切换到下一个元素。
CarouselRun 按照元素的插入顺序迭代元素。 当某个元素减少到零时,CarouselRun 将在进一步的迭代中跳过它。当没有更多元素可用于递减时,CarouselRun 返回 -1。
CarouselRun 还具有 isFinished 方法,该方法指示轮播是否已用完要递减的元素。
规范详情 DecrementingCarousel 有两个公共(public)方法:
boolean addElement(int element) - 添加一个元素。如果 element 为负数或零,则不添加该元素。如果容器已满,则不要添加元素。如果调用 run 方法来创建 CarouselRun,则不要添加该元素。如果元素添加成功,则返回true。否则返回 false。 CarouselRun run() - 返回一个 CarouselRun 来迭代元素。如果之前已经调用过 run 方法,则它必须返回 null:DecrementingCarousel 可能只生成一个 CarouselRun 对象。
CarouselRun 有两个公共(public)方法:
int next() - 返回当前元素的当前值,然后将当前元素减一并按插入顺序切换到下一个元素。跳过零个元素。当没有更多元素需要减少时,返回-1。
boolean isFinished() - 当没有更多元素要减少时,返回 true。否则,返回 false。
示例
空箱:
CarouselRun run = new DecrementingCarousel(7).run();
System.out.println(run.isFinished()); //true
System.out.println(run.next()); //-1
常规情况:
DecrementingCarousel carousel = new DecrementingCarousel(7);
carousel.addElement(2);
carousel.addElement(3);
carousel.addElement(1);
CarouselRun run = carousel.run();
System.out.println(run.isFinished()); //false
System.out.println(run.next()); //2
System.out.println(run.next()); //3
System.out.println(run.next()); //1
System.out.println(run.next()); //1
System.out.println(run.next()); //2
System.out.println(run.next()); //1
System.out.println(run.isFinished()); //true
System.out.println(run.next()); //-1
我的实现
递减轮播
public class DecrementingCarousel {
}
轮播运行
public class CarouselRun {
}
在新练习中,我需要扩展DecrementingCarousel。我需要实现HalvingCarousel。该子类必须将元素减半而不是减一。请注意,您需要应用常规整数除法,并丢弃余数。例如,5/2 = 2。
示例
空箱:
CarouselRun run = new HalvingCarousel(7).run();
System.out.println(run.isFinished()); //true
System.out.println(run.next()); //-1
常规情况:
DecrementingCarousel carousel = new HalvingCarousel(7);
carousel.addElement(20);
carousel.addElement(30);
carousel.addElement(10);
CarouselRun run = carousel.run();
System.out.println(run.isFinished()); //false
System.out.println(run.next()); //20
System.out.println(run.next()); //30
System.out.println(run.next()); //10
System.out.println(run.next()); //10
System.out.println(run.next()); //15
System.out.println(run.next()); //5
System.out.println(run.next()); //5
System.out.println(run.next()); //7
System.out.println(run.next()); //2
System.out.println(run.next()); //2
System.out.println(run.next()); //3
System.out.println(run.next()); //1
System.out.println(run.next()); //1
System.out.println(run.next()); //1
System.out.println(run.isFinished()); //true
System.out.println(run.next()); //-1
另一个
HalvingCarousel carousel = new HalvingCarousel(6);
carousel.addElement(7);
carousel.addElement(2);
carousel.addElement(100);
carousel.addElement(3);
carousel.addElement(1);
carousel.addElement(4);
CarouselRun run = carousel.run();
System.out.println(run.next());// 7
System.out.println(run.next());// 2
System.out.println(run.next());// 100
System.out.println(run.next());// 3
System.out.println(run.next());// 1
System.out.println(run.next());// 4
System.out.println(run.next());// 3
System.out.println(run.next());// 1
System.out.println(run.next());// 50
System.out.println(run.next());// 1
System.out.println(run.next());// 2
System.out.println(run.next());// 1
System.out.println(run.next());// 25
System.out.println(run.next());// 1
System.out.println(run.next());// 12
System.out.println(run.next());// 6
System.out.println(run.next());// 3
System.out.println(run.next());// 1
System.out.println(run.next());// -1
System.out.println(run.isFinished()); //true
默认的扩展类如下所示
public class HalvingCarousel extends DecrementingCarousel {
public HalvingCarousel(final int capacity) {
super(capacity); }
}
DecrementingCarousel 的方法(addElement 和 run)仍然有效,所以我没有更改它。
我决定更改 CarouselRun 方法来解决新问题,这就是我得到的结果。它适用于新任务,但不适用于旧任务。在该任务中,要求它在递减和减半两种情况下都有效。我需要帮助如何使其在这两种情况下都有效。
我的代码适用于减半。
public class CarouselRun {
}
最佳答案
如果您要实现 DecreasingCarousel 方法的 next() 方法可能会更好。然后你可以重写 HalvingCarousel 中的 next() 方法。
一种不太优雅的方法,不需要您重写代码,但如果您要包含对 .run() 方法中使用的类的检查并将其传递到 CarouselRun 上。 支票看起来像这样:
public boolean checkClass(){
return getClass()==DecrementingCarousel.class;
}
如果该对象是“原始”类的实例,则返回 true;如果它是子类或不相关类的一部分,则返回 false。
但这不是子类应该如何使用的方式。
关于java - Java中的类扩展实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73135188/