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描述的方式覆盖构造函数,但找不到它。我很感激任何提示。
答案 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)
,它将在构造超级对象时被调用,你显然不应该在子类型构造函数中第二次调用它(无论是类,对象还是混合特征)。