gpt4 book ai didi

Java:包含内部枚举的接口(interface);在实现类中扩展功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:10:42 24 4
gpt4 key购买 nike

我有如下界面:

package example;
import java.awt.Point;

public interface Thing {
public enum MovingState {
MOVING_LEFT,
MOVING_UP,
MOVING_RIGHT,
MOVING_DOWN
}

public void setNewPosition(MovingState state);
public Point getPosition();
}

和一个实现类:

package example;
import java.awt.Point;

public class ThingImpl implements Thing {
public enum MovingState {
MOVING_LEFT (-1, 0),
MOVING_UP (0, -1),
MOVING_RIGHT (1, 0),
MOVING_DOWN (0, 1);

private int x_move;
private int y_move;

MovingState(int x, int y) {
x_move = x;
y_move = y;
}

public int xMove() {
return x_move;
}

public int yMove() {
return y_move;
}
}


private Point position;

public void setNewPosition(MovingState state) {
position.translate(state.xMove(), state.yMove());
}

public Point getPosition() {
return position;
}
}

想法是让 ThingImpl 中的 MovingStateThing 接口(interface)扩展 MovingState(从而分离实际的从接口(interface)实现 MovingState

虽然这不起作用 - ThingImpl 中的 MovingState 枚举隐藏了接口(interface)中的定义而不是扩展它,然后编译器提示 ThingImpl 是不是抽象的,也不会覆盖 Thing 中的抽象方法 setNewPosition(Thing.MovingState)。

是否有实际的方法可以实现我想要实现的目标?还是 Java 根本就没有这种能力?

最佳答案

您真正想要做的是从“ThingImpl”类中删除枚举声明,并将其全部(包括其构造函数和 getter)移至 Thing 接口(interface)中。

让您的字段在枚举中成为最终字段,以记住它们不应该被触及。

以这种方式,任何希望使用 Thing 接口(interface)的东西都必须使用接口(interface)上定义的枚举 - 你的问题是你有效地定义了它两次,但它应该在接口(interface)上(如果它会仅用于此接口(interface))或作为公共(public)级别枚举 Java 文件(使用公共(public)枚举而不是公共(public)类)。如果您的接口(interface)以外的其他东西可以合理地期望使用它,您会将它设为公共(public)枚举 - 在我看来,Map.Entry 是一个糟糕的嵌套接口(interface),因为其他类已经使用了 map 外部的键/值对,并且因此它应该有自己的界面,但我们必须忍受它:(

The idea is to have MovingState in ThingImpl extend MovingState from the Thing interface (thus separating the actual implementation of MovingState from the interface).

我不认为这真的是你的主意 - 我认为你在 Thing 的界面上指定的行为很好,你真的不想触及 MovingState 枚举,因为它很好。但是,如果您认为某些东西需要 MovingState 的不同实现,您可以让它实现一个名为 MovingState 的接口(interface),因此您可以重命名您的枚举 DefaultMovingState。这是你的选择。

您的 MovingState 接口(interface)将只包含您现在在 MovingState 中公开的 getter。两种方法。

关于Java:包含内部枚举的接口(interface);在实现类中扩展功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3242145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com