java - Java中的类扩展实现

标签 java class extension-methods

我需要帮助如何使类扩展实现在不同情况下工作。

在培训期间,我完成了下一个任务:

*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/

相关文章:

java - 使用 java web start 启动 eclipse RCP 应用程序时无法获得启动屏幕

java - Maven 插件可以自动从 "configuration"部分看到 "execution"标签吗?

java - 清除文件夹-删除文件夹中的文件-J2ME

c# - ((System.Object)p == null)

c# - 对于封装和可重用性,首选扩展方法?

c# - C# 扩展方法可以访问私有(private)变量吗?

java - 指定 ArrayList 的类型

c# - 试图创建一个包含结构的数组?

python - 将变量从一个类传递到另一个 Python

c# - 是否可以扩展 Entity Framework 以添加新的数据库查询类型?