11

In below code I receive this error :

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

If I initialize all of the instance variables of class Animal to _ then the code compiles correctly. What does these error mean ?

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
  }

}
4

1 に答える 1

26

変数を初期化する必要があります。そうしないと、Scala は抽象クラスを作成していると見なし、サブクラスが初期化を埋めます。(初期化されていない変数が 1 つしかない場合は、コンパイラがそのように通知します。)

書き込み= _により、Scala にデフォルト値が入力されます。

重要なのは、誰かが (たとえば、最初に設定する必要があることを忘れた後で) サウンドなどを使用する何かを設定せずに呼び出した場合に何が起こるかを考えさせることです。

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

于 2013-08-26T21:39:37.867 に答える