2014-06-12 41 views
1

下面是我如何把Java接口,構建一個共同的合同實現的一些功能的示例:從接口轉換爲特徵

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()); 


    } 

} 

移動到斯卡拉性狀這裏是我已經重新實現了與上面相同的邏輯:

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

當特徵未在其合約中提供值或函數的默認實現時,不需要包含'override'關鍵字。 – KChaloux

+0

...但很好。 –

回答

1

這個例子似乎對我很好。幾句話:

1)如果你有特性成員不改變,可以考慮將它們聲明爲lazy val s。另一方面,惰性值只會被評估一次(當它們被要求時第一次),def則會在每次被調用時被評估。 2)如果你想阻止其他類繼承你的性狀,可以考慮將它聲明爲sealed trait。這意味着只有在同一個文件中聲明的子類纔會被接受。

3)你不需要空括號來在Scala中實例化一個類。

4)來自Java接口的Scala特徵最重要的區別是它們也可以包含方法的實現,而不是僅僅聲明它們。 (大家好,多重繼承:))

考慮所有這些,我們可以把下面的方式您的具體的例子:

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" 
} 

(當然,這一切都只是表面文章用非常基本的示例:))

1

是的,這是您可以在Scala中使用特徵的一種方式。

但與Java不同,Scala特徵還可以包含(可能是默認的)實現的位。

雖然他們是斯卡拉的複雜野獸,我建議閱讀他們使用的詳細解釋。

+0

您是否查看了[Java 8中的inerfaces上的默認方法](http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)?您仍然無法將字段添加到Java接口,但是您可以提供方法的實現。 Scala特徵仍然更加靈活,因爲它們基本上只是具有0參數構造函數的抽象類。 – DaoWen

+0

我假設Java 7。 –