gpt4 book ai didi

java - 有没有一种方法可以在不失去 Java 可替代性的情况下使用委托(delegate)设计模式?

转载 作者:行者123 更新时间:2023-11-29 05:49:55 25 4
gpt4 key购买 nike

这个问题是指找到的Delegation设计模式here .

我的游戏引擎有许多接口(interface),代表各种实体:

  • 播放器
  • 车辆
  • 网格
  • 等等

并且它们中的每一个都可以被渲染,所以它们实现了包含方法 render() 的 Renderable 接口(interface)。

方法一

使用委托(delegate),一个例子如下:

public interface Vehicle {

public void drive();

}

public class Car implements Vehicle {

public Renderable renderable;

@Override
public void drive() { // ... }

}

每当我想渲染汽车时,我只需调用 car.renderable.render();

此方法的问题是我无法创建 List 并遍历它。

方法二

为了解决这个问题,我可以让 Vehicle 扩展 Renderable:

public interface Vehicle extends Renderable {

public void drive();

}

但问题在于,如果我定义 Car、Bicycle、Truck、Tank 等,这些类中的每一个都必须填写 render() 的代码(它们可能是相同的)。

有没有一种方法可以保持在我的 Vehicle 接口(interface)中扩展 Renderable 的好处,而不必被迫在我所有实现 Vehicle 的具体类中定义 render() ?

最佳答案

关于我的评论,

Does each class that holds a Renderable have a public Renderable getRenderable() method? And if so, couldn't this be made into an interface allowing you to hold a collection of these beasts?

我的意思是这样的:

interface Renderable {
void render();
}

interface RenderDelegator {
Renderable getRenderable();
void setRenderable(Renderable renderable);
}

abstract class Vehicle implements RenderDelegator {
private Renderable renderable;

@Override
public Renderable getRenderable() {
return renderable;
}

@Override
public void setRenderable(Renderable renderable) {
this.renderable = renderable;
}

public abstract void drive();
}

class Car extends Vehicle {
@Override
public void drive() {
// TODO finish!
}

}

并否决了关于实现 Iterable 的建议。我不确定自己在想什么。

关于java - 有没有一种方法可以在不失去 Java 可替代性的情况下使用委托(delegate)设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327762/

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