【问题标题】:Problems with Scala InheritanceScala 继承的问题
【发布时间】: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


【解决方案1】:

您可能希望对这些类使用伴随对象,以重载构造函数方法:

一旦有了伴生对象,您就可以根据需要创建任意数量的apply 方法。 Scala 中的apply(在伴随对象内部)是一种语法糖,它允许您在没有 new 关键字的情况下创建类的新实例 - 更易于阅读构造函数(阅读何时使用伴随对象)。

此外,尽管您想用相同的参数重载构造函数方法,但这是不可能的 - 这是 Scala 的 相同的构造函数。编译器无法选择您需要使用的构造函数,因此为了避免这种情况,Scala 不允许您使用 same 构造函数两次。如果您以任何方式更改参数(参数类型或数量),您会发现它确实允许您创建第二个构造函数。

【讨论】:

  • 'value += is not a member of Int',如何从父类访问'var'属性?
  • 您能否更具体地了解value += is not a member of Int?该运算符不在您的原始帖子中。
  • 另外,关于var 变量。你的父类就像一个“cake pan”:你定义形状(参数或函数);你的孩子班是蛋糕:可能是胡萝卜或巧克力蛋糕……如果要蛋糕的糖霜,你不要问平底锅,你要问蛋糕。在英语中,您不会问父类,而拥有信息的子类也是如此。 编辑:您的父母的属性存在于您的孩子班级中:您使用父母来塑造您的孩子班级。您可以在Wikipedia 中查找。
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多