2013-04-21 146 views
2

In the docs,它说我应该做这样的新类:覆盖Java的构造在斯卡拉

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

现在我想重新做,在斯卡拉:

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描述,但无法找到它。我会很感激任何提示。

+4

没有重写构造函数的东西。构造函数支持的唯一一种多态是超载。 – 2013-04-21 18:34:17

回答

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是周围类的成员。

+0

所以我不能在这里使用'object'? – Lanbo 2013-04-21 16:50:23

+0

如果您在扩展'GLSurfaceView'时可以提供'ctx'参数,则可以。 – axel22 2013-04-21 16:53:17

+0

难道Scala会在自己的初始化之后调用super-Constructor *吗? – Lanbo 2013-04-21 17:36:32

0

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

所以你不能重写的东西,你没有继承。你应该为基类使用现有的构造函数之一。如果它们全都调用setRenderer(renderer)它将在构造超级对象时被调用,并且显然不应该在子类型构造函数中第二次调用它(类,对象或混入特征)。