问题很简单,但我不确定是否能够实现...
如果我们有一个类如下:
我们可以看到,它只是一个包含私有成员和setter/getter的类。有趣的是,为了允许方法链,setter返回了
因此,我们可以像这样做:
这里的问题是,当我尝试扩展该类并实现一个接口来添加一些功能时,会出现以下情况:
因为
顺便说一下,我只是写了一个基本的代码来简单理解,但如果你想了解更多,我正在尝试扩展一些libgdx的基本类(如
如果我们有一个类如下:
class A {
private int foo;
public A(int bar) {
this.foo = bar;
}
public A setFoo(int bar) {
this.foo = bar;
return this;
}
public int getFoo() {
return this.foo;
}
public void doSomething() {
this.foo++;
}
}
我们可以看到,它只是一个包含私有成员和setter/getter的类。有趣的是,为了允许方法链,setter返回了
this
。因此,我们可以像这样做:
A a = new A(0);
a.setFoo(1).doSomething();
这里的问题是,当我尝试扩展该类并实现一个接口来添加一些功能时,会出现以下情况:
class B extends A implements I {
public B(int bar) {
this.super(bar);
}
public void methodI() {
// whatever
}
}
在我这样使用它之前,它似乎还好。
B b = new B(1);
b.setFoo(2).methodI();
因为
setFoo
实际上返回的是A
类的一个实例,而不是B
类的实例,在A
类中没有methodI
方法...是否有任何解决方法?谢谢。顺便说一下,我只是写了一个基本的代码来简单理解,但如果你想了解更多,我正在尝试扩展一些libgdx的基本类(如
Math.Vector2
,Math.Vector3
)以实现Poolable。
reset()
方法,但这不是 Poolable 的重点。 实现 Poolable 的主要目的是避免创建和销毁新对象,从而大量调用gc
。这与性能有关。 想象一下,一个关键函数每秒钟调用60次,在其中使用 Vectors 作为局部变量。它们将被每次创建和销毁,这在桌面上可能还可以,但在移动游戏中可以进行优化。 - danikazePool
的作用,而不是Poolable
。或者你的意思是完全不使用Pool
,而是手动调用重置方法吗? - XoppaPool
),这些对象需要实现Poolable
接口...所以我不明白你的观点是什么... - danikazePool
可以池化任何类型的对象,而不仅仅是实现了Poolable
接口的对象。实现Poolable
接口的唯一原因是如果您需要调用reset
方法来清除对象引用并可能设置默认值。即使设置默认值也是不必要的,如果您正在创建一个专门处理您的对象类型的Pool
子类,因为您可以使用newObject
方法设置默认值。 - Tenfour04