【发布时间】:2021-07-31 17:59:55
【问题描述】:
) 我有一个名为 Mob 的父类,我正在创建两个子类 Human 和 Monster。
abstract class Mob(
var name: String,
var healthPoints: Int,
var attackPower: Int,
var defense: Int
) {
var level: Int = 1
var isAlive: Boolean = true
val attackBooster: Map[String, Int]
def attack(opponent: Mob): Unit
def getSound: String
def boostAttack(attributes: List[Int]): List[Int] = {
attributes.map((x: Int) => x + this.attackPower)
}
}
class Human(
override var name: String,
override var healthPoints: Int,
override var attackPower: Int,
override var defense: Int,
var strength: Int,
var agility: Int,
var intelligence: Int,
var profession: String,
var kingdom: String
) extends Mob(
name: String,
healthPoints: Int,
attackPower: Int,
defense: Int
) {
def this(
name: String,
healthPoints: Int,
attackPower: Int,
defense: Int,
strength: Int,
agility: Int,
intelligence: Int,
profession: String = "",
kingdom: String = ""
) {
this(name, healthPoints, attackPower, defense, strength, agility, intelligence, profession, kingdom)
this.profession = chooseProfession(profession)
this.kingdom = chooseKingdom(kingdom)
}
class Monster(
override var name: String,
override var healthPoints: Int,
override var attackPower: Int,
override var defense: Int,
var toxicity: Int,
var brutality: Int,
var confusion: Int,
var curse: Int,
var kind: String
) extends Mob(
name: String,
healthPoints: Int,
attackPower: Int,
defense: Int
) {
def this(
name: String,
healthPoints: Int,
attackPower: Int,
defense: Int,
toxicity: Int,
brutality: Int,
confusion: Int,
curse: Int,
kind: String = ""
) {
this(name, healthPoints, attackPower, defense, toxicity, brutality, confusion, curse, kind)
this.kind = chooseKind(kind)
}
关于这种继承的问题是:
- 我无法重载默认构造函数(构造函数被定义了两次,并且对重载定义的引用不明确)
- 我不能重载父 Mob 类的可变成员
我是 Scala 新手,很遗憾我找不到任何关于我的问题的解决方案。您能否澄清一下问题是什么以及我该如何解决?
【问题讨论】:
-
好吧,你的构造函数被定义了两次。不知道你想在那里做什么。只需删除第二个定义。至于可变成员......不要。如果你要学习使用 scala,你不妨做对。您不需要这些成员是可变的(实际上也不需要覆盖它们)。假装
var不存在。相信我,你不会错过的。 -
@Dima 我想包含从其他方法接收 Human.kingdom、professional 和 Monster.kind 的构造函数。这就是构造函数在所需参数方面“重复”的原因。关于'vars',我如何覆盖它们或简单地在派生类中定义它们?
-
您的第二个构造函数与第一个构造函数具有相同的参数。如果您希望某些参数来自其他地方,您应该从定义中删除它们。至于
vars,就像我说的:不要使用vars。此外,您不需要覆盖它们。它们已在父级中定义。
标签: scala inheritance