2011-12-27 209 views
4

的父类的构造参数Scala的处理是困惑我...父类的构造函数

与此代码:

class ArrayElement(val contents: Array[String]) { 
    ... 
} 

class LineElement(s: String) extends ArrayElement(Array(s)) { 
    ... 
} 

LineElement宣布延长ArrayElement,我觉得奇怪,我说Array(s)参数在ArrayElement(Array(s))正在创建一个数组实例 - 运行时间?这是斯卡拉的合成糖还是还有别的东西在这里?

回答

9

是的,在运行时计算Array(s)表达式。

class Foo (val x: Int) 
class Bar (x: Int, y: Int) extends Foo(x + y) 

斯卡拉允许在调用父类的构造函数(类似于Java的其使用的super(...)一样)表达式。这些表达式在运行时进行评估。

+0

我想这是Scala的语法糖,然后...喜欢的东西:类LineElement(S:字符串)扩展ArrayElement({println(“>> SubClass!”); Array(s)}){...}是可能的 – Dzhu 2011-12-27 23:23:08

2

实际上Array(s)是在运行时评估的,因为您使用的结构是对您的超类的主构造函数的有效调用。回想一下,一个类只能在其定义class A(param:AnyRef)中带有参数的主构造函数中,其他构造函数被称为this,并且要求调用主构造函数(或者将构造函数链接到它)。

而且,超级调用上存在这样的约束,也就是说,子类主构造函数调用超级主构造函数。

这里是怎么看这样的斯卡拉结构

class Foo (val x: Int) 
class Bar (x: Int, y: Int) extends Foo(x + y) 

了Java对口

public class Foo { 
    private x:int; 
    public Foo(x:int) { 
    this.x = x; 
    } 
    public int getX() { 
    return x; 
    } 
} 

public class Bar { 
    private y:int; 

    public Bar(x:int, y:int) { 
    /**** here is when your array will be created *****/ 
    super(x+y); 
    this.y = y; 
    } 

    public int getY() { 
    return y; 
    } 
}