下面是我如何使用 Java 接口(interface)构建通用契约来实现某项功能的示例:
package main.java;
public class Main {
interface Calculate {
public int run();
}
private class Calc1 implements Calculate {
@Override
public int run() {
return 1;
}
}
private class Calc2 implements Calculate {
@Override
public int run() {
return 0;
}
}
public static void main(String args[]){
Main m = new Main();
Calculate c = m.new Calc1();
System.out.println(c.run());
c = m.new Calc2();
System.out.println(c.run());
}
}
这里是我如何重新实现与上面相同的逻辑的转向 Scala 特征:
package main.scala
object traitsfun {
println("Welcome to the Scala worksheet") //> Welcome to the Scala worksheet
trait Calc {
def run: Int
}
class Calc1 extends Calc {
override def run = 1
}
class Calc2 extends Calc {
override def run = 0
}
val c1 = new Calc1().run //> c1 : Int = 1
val c2 = new Calc2().run //> c2 : Int = 0
}
这就是 Scala 特征的使用方式吗?
最佳答案
这个例子对我来说似乎没问题。几点说明:
1) 如果您有不改变的特征成员,请考虑将它们声明为lazy val
。惰性 val 仅评估一次(第一次需要时),而 def 则在每次调用时评估。
2) 如果您想阻止其他类继承您的特征,请考虑将其声明为密封特征
。这意味着只有在同一文件中声明的子类才会被接受。
3) 在 Scala 中实例化类不需要空括号。
4) Scala 特性与 Java 接口(interface)最重要的区别是它们还可以包含方法的实现,而不仅仅是声明它们。 (你好,多重继承:))
考虑到所有这些,我们可以按以下方式重写您的特定示例:
package main.scala
object traitsfun {
println("Welcome to the Scala worksheet") //> Welcome to the Scala worksheet
sealed trait Calc {
lazy val run: Int = 0 // val should have a default value
def standardMethod(param:String) = println(s"Hello $param")
}
class Calc1 extends Calc {
override lazy val run = 1
}
class Calc2 extends Calc {
override lazy val run = 0
}
val c1 = (new Calc1).run //> c1 : Int = 1
val c2 = (new Calc2).run //> c2 : Int = 0
(new Calc1).standardMethod("Calc1") //> "Hello Calc1"
}
(当然,所有这些只是通过非常基本的示例来了解皮毛:))
关于java - 从接口(interface)转换为特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193354/