Scalaで湯婆婆と+αを実装してみる

# 元ネタ
@NemesisさんのJavaで湯婆婆を実装してみるに便乗してみました。

#　Scalaいいよね
Scalaの言語仕様もりもりで書くのは[アドベントカレンダー](https://qiita.com/advent-calendar/2020/approvers)のネタとして取っておきたいのでとりあえず動くコード

# コード
```scala
import scala.sys.exit
import scala.util.Random

class Human() {
    var name: String = _
    var age: Int = Random.nextInt(100)
    var isPig: Boolean = _
}

class Contract(User: Human) {
    val sc = new java.util.Scanner(System.in)
    var isContract: Boolean = false
    var signatureName: String = ""

    def signature(): Unit = {
        signatureName = sc.next()
        User.name = this.signatureName
        isContract = true
    }
}

class Adults extends Human {
    var hasCreditCard: Boolean = _
    var isEatPermission: Boolean = _
}

class Yubaba(var User: Human) extends Adults {
    name = "yubaba"

    def initMessage(): Unit = {
        println("契約書だよ。そこに名前を書きな。")
        val contract = new Contract(User)
        contract.signature()
        if (contract.signatureName == "") {
            println("なんだいここで働きたくないのかい")
            exit()
        }
        println("フン。" + contract.signatureName + "というのかい。贅沢な名だねぇ。")
    }

    def changeName(): Unit = {
        val newNameIndex: Int = Random.nextInt(User.name.length)
        User.name = User.name.substring(newNameIndex, newNameIndex + 1)
        println("今からお前の名前は" + User.name + "だ。いいかい、" + User.name + "だよ。分かったら返事をするんだ、" + User.name + "!!")
    }
}

class Father extends Adults {
    name = "papa"
    hasCreditCard = true
    isEatPermission = false

    def eatFoods(): Unit = {
        if (hasCreditCard && !isEatPermission) isPig = true else isPig = false
    }
}

class Mother(var fiancee: Father) extends Adults {
    name = "mama"

    def eatFoods(): Unit = {
        if (fiancee.hasCreditCard && !fiancee.isEatPermission) isPig = true else isPig = false
    }
}

object Main {
    def main(args: Array[String]): Unit = {
        val sen = new Human
        val father = new Father()
        val mother = new Mother(father)
        val yubaba = new Yubaba(sen)

        father.eatFoods()
        mother.eatFoods()

        yubaba.initMessage()
        yubaba.changeName()
    }
}

```

# Human型
人間をObjectとして人間にしたかったので人間の型をつくりました。

```scala
class Human() {
    var name: String = _
    var age: Int = Random.nextInt(100)
    var isPig: Boolean = _
}
```

年齢は乱数で決めます。
豚かどうか確かめるための値も持たせました。
(千が実は豚かもしれないので)

# Adults型とパパとママ
パパとママを実装したかったので大人型をつくりました。

``` scala
class Adults extends Human {
    var hasCreditCard: Boolean = _
    var isEatPermission: Boolean = _
}
```
今のところはパパとママ用に作ったので、飯を食う用の許可とクレジットカードの有無を実装しました。
将来的にはもっと増えてくかも？

```scala
class Father extends Adults {
    name = "papa"
    hasCreditCard = true
    isEatPermission = false

    def eatFoods(): Unit = {
        if (hasCreditCard && !isEatPermission) isPig = true else isPig = false
    }
}

class Mother(var fiancee: Father) extends Adults {
    name = "mama"

    def eatFoods(): Unit = {
        if (fiancee.hasCreditCard && !fiancee.isEatPermission) isPig = true else isPig = false
    }
}
```
本題のパパとママです。
パパはクレジットカードを持っていて且つ許可がないときにご飯を食べると豚にさせられます。
ママはパパが上の条件を満たしているときにご飯を食べると豚にさせられます。
これだけです。内部的にはありますが、今回の動作にはなんの影響もありません


(一応湯婆婆も大人なのでAdults型を継承しています。)

# 湯婆婆
とりあえず元の記事でも上げられていた"**名前の入力が空白だった場合**"はifで処理しておきました。一回しっかりエラーハンドリングしたんですが、前述したネタのために適当に実装しました。

```scala
if (contract.signatureName == "") {
    println("なんだいここで働きたくないのかい")
    exit()
}
```

# 最後に
深夜テンションで書いたので結構ガバあります。
~~マサカリ投げないで><~~