2013-08-26 10 views
10

Im folgenden Code erhalte ich diesen Fehler:Fehler: Klasse Tier braucht abstrakt zu sein, da: es verfügt über 5 unimplemented Mitglieder

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 = ??? 

Wenn ich all die Instanzvariablen der Klasse Tier zu initialisieren _ dann den Code kompiliert korrekt. Was bedeuten diese Fehler?

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 
    } 

} 

Antwort

23

Sie müssen Variablen initialisieren. Wenn Sie dies nicht tun, nimmt Scala an, dass Sie eine abstrakte Klasse schreiben, und eine Unterklasse wird die Initialisierung ausfüllen. (Der Compiler wird es Ihnen sagen, wenn Sie nur eine einzige nicht initialisierte Variable haben.)

Schreiben = _ macht Scala die Standardwerte ausfüllen.

Der Punkt ist, Sie darüber nachzudenken, was passiert, wenn jemand (z. B. Sie, nachdem Sie vergessen, dass Sie die Dinge zuerst setzen müssen) etwas anruft, das z. der Klang ohne dass er eingestellt wurde.

(In der Regel sollten Sie zumindest sorgfältig darüber nachdenken, ob dies der richtige Weg, um Ihren Code zu strukturieren, viele Felder, die Initialisierung erfordern vor dem Gebrauch sicher ist, ohne die mechanische Initialisierung zu erzwingen, für Probleme zu fragen.)

Verwandte Themen