Переопределение родительского метода в scala - PullRequest
0 голосов
/ 03 мая 2020

У меня есть объекты Sock и ChildSock, которые расширяют Sock.

class Sock
class ChildSock extends Sock

У меня также есть класс Human, который может «носить» тип Sock, и класс HumanChild, который расширяет класс Human, и есть метод износа, включающий ChildSock, который должен переопределить родительский метод износа.

class Human {
    def wear(s: Sock) = println("Sock worn")
}
class HumanChild extends Human {
    def wear(s: ChildSock) = println("Child sock worn")
}

Теперь, когда я пытаюсь запустить следующее,

val csock : ChildSock = new ChildSock
val h1: Human = new HumanChild
val h2: HumanChild = new HumanChild

h1.wear(csock)
h2.wear(csock)

я получаю следующие выходные данные :

> Sock Worn
> Child Sock Worn

Но я хочу, чтобы оба сообщения были "Child Sock Worn", поскольку объект csock - это дочерний носок. Но я могу изменить только код для класса HumanChild и ничего больше. Как я могу это сделать?

Что я уже пробовал:

Я попытался переопределить метод в классе HumanChild, как показано ниже:

class HumanChild extends Human {
    def wear(s: ChildSock) = println("Child sock worn")
}

но он вернулся:

error: method accept overrides nothing.
Note: the super classes of class HumanChild contain the following, non final members named wear:

Так что я не слишком уверен, что делать.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Проблема в том, что def wear(s: ChildSock) не обрабатывает случай, когда s является Sock, но не ChildSock. Поэтому он не может переопределить def wear(s: Sock).

Возможно, вы хотите что-то вроде этого:

class HumanChild extends Human {
  override def wear(s: Sock) =
    s match {
      case _: ChildSock => println("Child sock worn")
      case _ => super.wear(s)
    } 
}
0 голосов
/ 04 мая 2020

Вы также можете ввести тип члена

class Human {
  type S <: Sock
  def wear(s: S) = println("Sock worn")
}
class HumanChild extends Human {
  override type S = ChildSock
  override def wear(s: S) = println("Child sock worn")
}

val csock : ChildSock = new ChildSock
val h1: Human { type S = ChildSock } = new HumanChild
val h2: HumanChild = new HumanChild

h1.wear(csock) // Child sock worn
h2.wear(csock) // Child sock worn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...