2013-08-26 13 views
10

があります:エラー:それは、私はこのエラーが発生した以下のコードでは5人の未実装のメンバー

class Animal needs to be abstract, since: it has 5 unimplemented members. /** As seen from class Animal, the 
missing signatures are as follows. * For convenience, these are usable as stub implementations. */ def 
favFood_=(x$1: Double): Unit = ??? def flyingType_=(x$1: scala.designpatterns.Strategy.Flys): Unit = ??? def 
name_=(x$1: String): Unit = ??? def sound_=(x$1: String): Unit = ??? def speed_=(x$1: Double): Unit = ??? 

私は、コード_にクラスの動物のインスタンス変数のすべてを初期化する場合ので、クラスの動物は、抽象的である必要があります正しくコンパイルします。これらのエラーはどういう意味ですか?

package scala.designpatterns 

/** 
* 
* Decoupling 
* Encapsulating the concept or behaviour that varies, in this case the ability to fly 
* 
* Composition 
* Instead of inheriting an ability through inheritence the class is composed with objects with the right abilit built in 
* Composition allows to change the capabilites of objects at runtime 
*/ 
object Strategy { 

    def main(args: Array[String]) { 

    var sparky = new Dog 
    var tweety = new Bird 

    println("Dog : " + sparky.tryToFly) 
    println("Bird : " + tweety.tryToFly) 
    } 

    trait Flys { 
    def fly: String 
    } 

    class ItFlys extends Flys { 

    def fly: String = { 
     "Flying High" 
    } 
    } 

    class CantFly extends Flys { 

    def fly: String = { 
     "I can't fly" 
    } 
    } 

    class Animal { 

    var name: String 
    var sound: String 
    var speed: Double 
    var favFood: Double 
    var flyingType: Flys 

    def tryToFly: String = { 
     this.flyingType.fly 
    } 

    def setFlyingAbility(newFlyType: Flys) = { 
     flyingType = newFlyType 
    } 

    def setSound(newSound: String) = { 
     sound = newSound 
    } 

    def setSpeed(newSpeed: Double) = { 
     speed = newSpeed 
    } 

    } 

    class Dog extends Animal { 

    def digHole = { 
     println("Dug a hole!") 
    } 

    setSound("Bark") 

    //Sets the fly trait polymorphically 
    flyingType = new CantFly 

    } 

    class Bird extends Animal { 

    setSound("Tweet") 

    //Sets the fly trait polymorphically 
    flyingType = new ItFlys 
    } 

} 

答えて

23

変数を初期化する必要があります。そうしないと、スカラは抽象クラスを作成しているとみなし、サブクラスが初期化を行います。

書く場合= _を書くと、Scalaがデフォルト値になります。コンパイラは、初期化されていない変数が1つだけの場合はコンパイラに指示します。

重要な点は、誰か(たとえば、あなたが最初に物事を設定する必要があることを忘れてしまった後など)が、それなしの音は設定されていない。

(一般的にはあなたが、少なくともこれはあなたのコードを構造化するための正しい方法であるかどうかについて慎重に検討すべきである;。使い方が安全である前に初期化を必要とする多くのフィールドは、初期化を強制するいかなるメカニズムなしに、問題を求めている)

関連する問題