2

在 docs中,它说我应该像这样创建新类:

class MyView extends GLSurfaceView {
    public MyView(Context context) {
        super(context);
        setRenderer(renderer);
    }
}

现在我尝试在 Scala 中重新执行此操作:

class BaseGameActivity extends Activity {
    object glview extends GLSurfaceView(this) {
        setRenderer(renderer)
        setEGLContextClientVersion(2)
    }
}

但是,应用程序现在崩溃了,但“ java.lang.IllegalStateException: setRenderer already called for this instance”除外。我怀疑这与 Scala 调用超级构造函数的方式有关。

我试图找出如何以文档描述的方式覆盖构造函数,但找不到它。我会很感激任何提示。

4

2 回答 2

2

在我看来,您正在将调用传播到与基类不同的构造函数。您正在传递对对象的引用this而不是对Context对象的引用。可能是另一个构造函数正在调用setRenderer.

你可以尝试创建一个这样的内部类MyGLView

class MyGLView(ctx: Context) extends GLSurfaceView(ctx) {
  setRenderer(renderer)
}

看看会发生什么?

问题是object它的构造函数不允许参数。顶级对象必须可以在没有任何参数的情况下进行初始化(没有人调用它们的 ctor)。在您的情况下,您有一个内部对象,它可以引用周围类实例的成员。如果你真的需要你的类中的内部对象Activity,你可以这样做:

object glview extends GLSurfaceView(ctx) {
  setRenderer(renderer)
}

wherectx是周围类的成员。

于 2013-04-21T16:49:24.823 回答
0

在 java 中同样在 scala 构造函数不是继承的

所以你不能覆盖东西,你没有继承。并且您应该使用现有的构造函数之一作为基类。如果它们都在调用setRenderer(renderer)它,它将在构造超级对象期间被调用,并且您显然不应该在子类型构造函数中第二次调用它(无论是类、对象还是混合特征)。

于 2013-04-21T16:57:53.590 回答