dea*_*mon 6 java oop attributes abstract-class scala
在Scala中,我会编写一个带有抽象属性的抽象类path:
abstract class Base {
val path: String
}
class Sub extends Base {
override val path = "/demo/"
}
Run Code Online (Sandbox Code Playgroud)
Java不知道抽象属性,我想知道解决这个限制的最佳方法是什么.
我的想法:
a)构造函数参数
abstract class Base {
protected String path;
protected Base(String path) {
this.path = path;
}
}
class Sub extends Base {
public Sub() {
super("/demo/");
}
}
Run Code Online (Sandbox Code Playgroud)
b)抽象方法
abstract class Base { // could be an interface too
abstract String getPath();
}
class Sub extends Base {
public String getPath() {
return "/demo/";
}
}
Run Code Online (Sandbox Code Playgroud)
你更喜欢哪一个?其他想法?
我倾向于使用构造函数,因为不应该在运行时计算路径值.
Scala在内部做的是你所描述的方法B.
采用以下示例类:
abstract class Test{
val path: String
}
Run Code Online (Sandbox Code Playgroud)
当您使用scalac编译它时,它将生成一个抽象Java类,其中包含一个名为attr的抽象方法,它返回一个String.这可能发生的原因是,因为val是常数,因此它只能通过getter而不是setter来模拟.因此,如果要从Java访问此类,则可以简单地覆盖抽象getter方法.
这相当于将生成的Java类(javap的输出):
public abstract class Test extends java.lang.Object implements scala.ScalaObject{
public abstract java.lang.String path();
public Test();
}
Run Code Online (Sandbox Code Playgroud)