Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 错误:类Animal需要是抽象的,因为:它有5个未实现的成员_Scala - Fatal编程技术网

Scala 错误:类Animal需要是抽象的,因为:它有5个未实现的成员

Scala 错误:类Animal需要是抽象的,因为:它有5个未实现的成员,scala,Scala,在以下代码中,我收到此错误: 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: Doub

在以下代码中,我收到此错误:

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 = ???
如果我将类Animal的所有实例变量初始化为uu,那么代码将正确编译。这些错误意味着什么

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
  }

}

必须初始化变量。如果不这样做,Scala会假设您正在编写一个抽象类,而一个子类将填充初始化。(如果只有一个未初始化的变量,编译器会告诉您。)

写入
=
将使Scala填充默认值

重点是让你思考当某人(例如,你,在你忘记需要先设置东西之后)调用某个使用声音的东西时会发生什么,例如,没有设置声音

(一般来说,您至少应该仔细考虑这是否是构建代码的正确方法;许多在使用前需要初始化的字段是安全的,并且没有任何强制初始化的机制,这会带来问题。)