代码之家  ›  专栏  ›  技术社区  ›  blue-sky

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

  •  11
  • blue-sky  · 技术社区  · 11 年前

    在下面的代码中,我收到了这个错误:

    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类的所有实例变量初始化为_,那么代码将正确编译。这些错误是什么意思?

    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
      }
    
    }
    
    1 回复  |  直到 11 年前
        1
  •  26
  •   Rex Kerr    11 年前

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

    = _ 使Scala填充默认值。

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

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