我正在创建一个游戏,其中对象实现动画接口。我有一个动画的父界面。这是一个缩短的版本:
public interface Animates<S extends Animator> {
S createAnimator(long animationTime);
}
另外,我还有多个扩展这个接口的接口。两个例子:
public interface AnimatesPaint extends Animates<PaintAnimator> {
PaintAnimator createPaintAnimator(long animationTime);
default PaintAnimator createAnimator(long animationTime) {
return createPaintAnimator(animationTime);
}
}
和
public interface AnimatesPosition extends Animates<PositionAnimator> {
PositionAnimator createPositionAnimator(long animationTime);
@Override
default PositionAnimator createAnimator(long animationTime) {
return createPositionAnimator(animationTime);
}
}
正如您所看到的,扩展的接口Animates会覆盖该createAnimator方法,以便将逻辑委托createAnimator给实现该接口的类。
我这样做的原因是我希望能够有一个屏幕元素(可以动画)来实现多个动画界面(例如AnimatesPosition移动元素并AnimatesPaint更改其颜色)。
然而,这显然行不通。当我在一个类中实现两者时(如下所示),我收到编译错误:
AnimatesPaint 中的 createAnimator(long) 与 AnimatesPosition 中的 createAnimator(long) 冲突;尝试使用不兼容的返回类型
下面是一个实现两个 Animates 接口的类的示例:
public class ScreenElement implements AnimatesPaint, AnimatesPosition {
@Override
PositionAnimator createPositionAnimator(long animationTime) {
return new PositionAnimator(animationTime);
}
@Override
PaintAnimator createPaintAnimator(long animationTime) {
return new PaintAnimator(animationTime);
}
}
所以我不明白的是两者AnimatesPaint都AnimatesPosition已经实现了createAnimator。然而,错误消息似乎表明createAnimator还需要实施ScreenElement!如果createAnimator还没有实施,我会明白为什么会发生冲突。
我的逻辑哪里出了问题?
最后,我想要实现的是拥有一个可以启动任何类型动画的通用方法。例如:
public class AnimationStarter<S extends Animates, T> {
public void startAnimation(S animates, T start, T target, long animationTime) {
Animator animator = animates.createAnimator(animationTime);
animator.init(start, target);
animates.setAnimator(animator);
animator.startAnimation();
}
}
- 编辑 -
根据要求,这里是 Animator 的声明
public abstract class Animator<T> {}
及其扩展类之一
public class PositionAnimator extends Animator<Point>{}
蝴蝶不菲
Cats萌萌
相关分类