在Scala中覆盖Java构造函数

时间:2013-04-21 16:26:54

标签: android scala opengl-es-2.0

In the 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调用超级构造函数的方式有关。

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

2 个答案:

答案 0 :(得分:2)

在我看来,你正在将调用传播给基类中的不同构造函数。您正在传递对this的引用,而不是对Context对象的引用。可能是这个其他构造函数正在调用setRenderer

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

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

看看会发生什么?

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

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

其中ctx是周围类的成员。

答案 1 :(得分:0)

在java中同样用于scala构造函数are not inherited

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