Может ли одноэлементный объект расширить черту? - PullRequest
1 голос
/ 08 июля 2019

Я хочу расширить черту из объекта Scala и переопределить те методы, которые находятся в черте. Поэтому я сомневаюсь, что эти методы станут статичными для этого объекта или методы экземпляра, и это хороший подход для расширения от черты до Scala Object. Пожалуйста, помогите в этом

trait A{
  def show:Unit
}

object B extends A{
  override def show(): Unit = { 
    println("inside Object")    
  }    
}

Ответы [ 2 ]

3 голосов
/ 08 июля 2019

В Scala нет статических методов . object действительно может расширить trait. Переопределенные методы, такие как show, не становятся статическими методами, вместо этого они относятся к одному экземпляру из B.type. Это шаблон синглтона, предоставленный средством определения object в Scala.

Попробуйте следующее в Scala REPL:

object B
B

Это должно вывести что-то вроде

res0: B.type = B$@5688722f

Обратите внимание, что значение B имеет тип B.type, поэтому B - это просто значение / экземпляр, никак не связанный со статикой.

0 голосов
/ 09 июля 2019

Хм, я думаю, что общий пример / случай использования того, что вы только что описали, - это расширение черты App и переопределение определения main.

object test extends App
{  
  override def main (args: Array[String]): Unit = {
    println("Hello, let's get started")
  }
}

В общем, почему бы вам не определить сам класс для расширения черты?

Если вы собираетесь создавать новые экземпляры B, используя B() (вместо new B()), имеет смысл сделать это.

trait A{
  def show:Unit
}

object B { // companion aka singleton object
  def apply(){
    ...
  }
}

class B extends A{
  override def show(): Unit = { 
    println("inside Object")    
  }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...