我遇到错误:声音方法不能抽象。但是,当我删除“抽象”时,得到的类Dog和Cat需要抽象。我究竟做错了什么?任务说,“狗和猫”课应该保持具体。任务在下面。
package inheritance
abstract class Animal(name: String) {
abstract def sound(): String
override def toString(): Animal
}
class Cat(var name: String)
extends Animal(name)
{
override def sound() = {
"meow"
}
}
class Dog(var name: String)
extends Animal(name){
override def sound() = {
"woof"
}
}
object Park{
def animals() = {
List(new Dog("Snoopy"), new Dog("Finn"), new Cat("Garfield"), new
Cat("Morris"))
}
def makeSomeNoise(first :List[Animal]): List[String] = first.map(_.sound())
}
任务:
问题:[Scala]在一个名为“继承”的包中,创建一个名为“动物”的抽象类,以及一个名为“猫”和“狗”的具体类。
创建一个名为“ Park”的对象:
动物:构造函数,它使用名为name的字符串(请勿使用val或var。
它将在基类中声明);
名为sound的抽象方法,该方法不带任何参数并返回String
•重写toString以返回此动物的名称
猫:天生动物; 构造函数,将名为name的String作为值(使用val声明name);覆盖sound()以返回“喵”
“狗:固有动物;构造函数,将名为name的字符串作为值(使用val来声明名称);重写sound()返回“ woof”
公园:
•名为“ animals”的方法,不带任何参数,并返回包含
•2条名为“史努比”和“芬恩”的狗
•2只猫,名字分别是“加菲猫”和“莫里斯”
•名为“ makeSomeNoise”的方法,该方法将动物列表作为参数,并返回包含输入列表中每只动物发出的噪音的字符串列表
答案 0 :(得分:2)
好的,让我们解决其中的一些问题。
名为sound的抽象方法,该方法不带任何参数并返回String
修饰符abstract
仅用于类定义。抽象方法是抽象类中的方法,该方法没有主体,只显示名称和类型。
重写toString以返回此动物的名称
您尚未执行此操作。当前,您的toString
方法也是抽象的。
猫:天生动物;构造函数,将名为name的String作为值(使用val声明name);覆盖sound()以返回“喵”
这里说要使用val
,但是您的代码中有var
。
所以您在Cat
和Dog
上遇到问题的原因是因为Animal
在您当前定义时有两种抽象方法,您需要实现(覆盖)这两种方法创建动物的实例。
修复toString
方法,使其不再是抽象的,并返回正确的结果,您应该一切顺利。